Python 向RelatedManager添加方法
我使用以下属性从模板访问有序查询集:Python 向RelatedManager添加方法,python,django,django-models,Python,Django,Django Models,我使用以下属性从模板访问有序查询集: class Question(models.Model): @property def descending_choice_set(self): """ Order choice_set by votes descending. """ return self.choice_set.order_by('-votes') 但我更喜欢通过question.choice\u set.
class Question(models.Model):
@property
def descending_choice_set(self):
"""
Order choice_set by votes descending.
"""
return self.choice_set.order_by('-votes')
但我更喜欢通过
question.choice\u set.order\u by\u vots
访问它,而不是通过question.descending\u choice\u set
。对于此行为,必须覆盖RelatedManager
。如何实现这一点 您可以创建一个自定义管理器,并将所有方法(如order\u by\u vots
)放入其中。以下是一个例子:
from django.db import models
class ChoiceManager(models.Manager):
def order_by_votes(self):
return self.order_by('-vote_number')
# Create your models here.
class Choice(models.Model):
name = models.CharField(max_length=255)
vote_number = models.IntegerField()
# register your manager. You literally can put any variable name here.
# Just do not forget to access manager through it later :)
objects = ChoiceManager()
def __str__(self):
return self.name
用法:
In [1]: from app import models
In [2]: c = models.Choice.objects.create(name='first', vote_number=1)
In [3]: c = models.Choice.objects.create(name='second', vote_number=2)
In [4]: models.Choice.objects.order_by_votes()
Out[5]: <QuerySet [<Choice: second>, <Choice: first>]>
[1]中的:来自应用程序导入模型
在[2]中:c=models.Choice.objects.create(name='first',vote_number=1)
在[3]中:c=models.Choice.objects.create(name='second',vote_number=2)
[4]中:models.Choice.objects.order\u by\u vots()
出[5]:
正如塔拉斯所说,您可以编写一个自定义管理器。但是编写自定义管理器只允许为模型本身调用该方法。
为了覆盖相关的管理器方法,您需要为相关的字段使用设置use\u
将管理器上的use\u for_related\u字段设置为True,将使其可用于指向将此管理器定义为默认管理器的模型的所有关系。这是有案可查的
为模型编写自定义管理器,并将上述设置设置为True。我建议编写问题和选择模型的管理器,以获得更好的功能,并添加设置
class MyManager(models.Manager)
use_for_related_fields = True # ...
def order_by_votes(self):
return self.order_by('-vote_number')