什么是 queryset = super().get_queryset()?

what is queryset = super().get_queryset()?

这两段代码完全相同

class PostDetail(generic.DetailView):
    model = models.Post

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(.........)

class PostDetail(generic.DetailView):
    model = models.Post

    def get_queryset(self):
        return post.filter(.........)

这条线实际上做了什么 queryset = super().get_queryset() 没有这条线会发生什么?

两者并不相同,或者至少本身不同。 super() 用于获取 get_queryset 的实现,它是 方法解析顺序 (MRO) 中的下一个。如果classes只有一个baseclass,你可以认为这是parent class,但是在Python multiple inheritance是允许的,因此MRO的规则更加复杂。

无论如何,super().get_queryset,将因此调用 get_queryset 它是如何为 DetailView class 实现的。这是一个重要的区别,因为基本 get_queryset() 方法将 首先 查找 queryset 属性,如果不存在,它将使用 model._default_manager.all().

如果您因此指定一个 queryset 属性,则两者并不相同,例如,如果我们定义一个 queryset 为:

class PostDetail(generic.DetailView):
    model = models.Post
    queryset = models.Post.objects.filter(<b>active=True</b>)

那么你使用 super().get_queryset() 的实现将只显示活跃的 Posts,而使用 Post.objects.filter(…) 的实现将显示所有满足过滤器但不活跃的帖子 Posts.

如果您使用 mixins,那么它将根据您使用 mixin 的顺序调用这些 mixin 之一的 get_queryset(),因此可以导致更复杂的过滤。