什么是 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()
的实现将只显示活跃的 Post
s,而使用 Post.objects.filter(…)
的实现将显示所有满足过滤器但不活跃的帖子 Post
s.
如果您使用 mixins,那么它将根据您使用 mixin 的顺序调用这些 mixin 之一的 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()
的实现将只显示活跃的 Post
s,而使用 Post.objects.filter(…)
的实现将显示所有满足过滤器但不活跃的帖子 Post
s.
如果您使用 mixins,那么它将根据您使用 mixin 的顺序调用这些 mixin 之一的 get_queryset()
,因此可以导致更复杂的过滤。