Django中的get_queryset vs manager

时间:2019-01-19 01:58:11

标签: django

据我所知,我们是由模型管理员来管理数据库的,对吧?

例如queryset = Model.objects.all()

但是有时候,我看到一些代码看起来几乎是一样的东西,但是有些不同,

post = self.get_queryset()

它也获取数据库,但不是由管理器获取。

通过管理器和get_queryset()获取数据库及其用法之间有什么区别?

1 个答案:

答案 0 :(得分:1)

以下示例可帮助您了解ModelManagerget_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。因为我们覆盖了默认的模型管理器查询集。