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_queryset
或 Person.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()
所以我对在 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_queryset
或 Person.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()