什么是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()用于获取方法解析顺序 (MRO) 中get_queryset下一个的实现。如果类只有一个基类,您可以将其视为父类,但在 Python中允许多重继承,因此 MRO 的规则更加复杂。

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

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

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

那么您的实现 withsuper().get_queryset()只会显示 active Posts,而实现 withPost.objects.filter(…)将显示满足过滤器但不是 se active Posts 的所有帖子。

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


以上是什么是queryset=super().get_queryset()?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>