据我所知,我们是由模型管理员来管理数据库的,对吧?
例如queryset = Model.objects.all()
但是有时候,我看到一些代码看起来几乎是一样的东西,但是有些不同,
post = self.get_queryset()
它也获取数据库,但不是由管理器获取。
通过管理器和get_queryset()获取数据库及其用法之间有什么区别?
答案 0 :(得分:1)
以下示例可帮助您了解ModelManager
和get_queryset
是什么:
class PersonQuerySet(models.QuerySet):
def authors(self):
return self.filter(role='A')
def editors(self):
return self.filter(role='E')
class PersonManager(models.Manager):
def get_queryset(self):
return PersonQuerySet(self.model, using=self._db)
def authors(self):
return self.get_queryset().authors()
def editors(self):
return self.get_queryset().editors()
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 = PersonManager()
每个模型都有至少一个模型管理器,get_queryset
是模型管理器的基础QuerySet
。
使用Person.objects.all()
时,它将返回Person
模型的所有结果,而不是过滤器或其他任何结果。
在上面的示例中,我们使用了名为PersonManager
的自定义模型管理器,其中我们覆盖了get_queryset
。
首先,我们对authors
应用role='A'
过滤器。
其次,我们将editors
过滤器与role='E'
一起使用。
因此,现在,如果我们使用Person.people.all()
,它将仅返回authors
。看这里,我们使用all()
,但它仅返回authors
。因为我们覆盖了默认的模型管理器查询集。