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

时间:2017-06-11 03:40:42

标签: django django-models django-database

所以我有兴趣在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()

我知道视图调用模型而模型调用模型管理器,但它让我感到困惑。我可以指定哪个视图调用哪个管理器或模型通过其他方式隐式地处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

根据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)

&#34;作者&#34; /&#34;编辑&#34;上面的变量将成为你的模型传回的任何东西。

显然,您需要在经理中定义新方法。 E.g。

在模特中:

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

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

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

答案 1 :(得分:0)

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