Django 如何知道使用哪个模型管理器?

How does Django know which model manager to use?

所以我对在 Django 项目中使用下面的示例代码很感兴趣,但在试图理解我将如何显式调用一个模型管理器时感到困惑。

class AuthorManager(models.Manager):
    def get_queryset(self):
        return super(AuthorManager,    self).get_queryset().filter(role='A')

class EditorManager(models.Manager):
    def get_queryset(self):
        return super(EditorManager, self).get_queryset().filter(role='E')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    role = models.CharField(max_length=1, choices=(('A', _('Author')), ('E', _('Editor'))))
    people = models.Manager()
    authors = AuthorManager()
    editors = EditorManager()

我知道视图调用模型而模型调用模型管理器,但这让我有点困惑。我可以指定哪个视图调用哪个管理器,或者模型是否通过其他方式隐式处理该问题?

根据 documentation,您可以使用 Person.authors.get_querysetPerson.editor.get_queryset 从您的视图调用任一模型管理器。此外,您可以将数据传回任一管理器。例如:

观看次数:

data = {
    'first_name' : request.POST['first_name'],
    'last_name' :request.POST['last_name'],
    'email' : request.POST['email'],
  }
author = Person.authors.new_author(data)
editor = Person.editor.new_editor(data)

上面的 "author"/"editor" 变量将成为您的模型传回的任何内容。

显然,您希望在管理器中定义新方法。例如

型号中:

class AuthorManager(models.Manager):
    def new_author(self):
        Person.authors.create(...)

class EditorManager(models.Manager):
    def new_editor(self):
        Person.editors.create(...)

您可以选择让您的模型将您需要的任何用户信息传回您的视图。

class PersonQuerySet(models.QuerySet):
    def authors(self):
        return self.filter(role='A')

    def editors(self):
        return self.filter(role='E')

class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        role = models.CharField(max_length=1, choices=(('A', _('Author')), ('E', _('Editor'))))
        people = models.Manager()
        objects = PersonQuerySet.as_manager()

获取作者和编辑:

authors = Person.objects.authors()
editors = Person.objects.editors()