什么是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_queryset在DetailView这里调用它是如何为类实现的。这是一个重要的区别,因为基本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 之一,从而可以导致更复杂的过滤。