Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向RelatedManager添加方法_Python_Django_Django Models - Fatal编程技术网

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')