很多时候,我看到了这一点:
def get_queryset(self):
queryset = super(SomeView, self).get_queryset()
return queryset.filter(published=True)
这在基于Django类的视图中是典型的。我想知道的是,为什么我们这样做,当我们可以这样做时:
queryset = someModel.objects.all().filter(args)
或者如果您更喜欢两条线(或者您认为我只喜欢一条线,这不是这种情况):
all_the_stuff = someModel.objects.all()
the_stuff_we_want = all_the_stuff.filter(...)
此外,super()
调用背后的逻辑如何正常工作,因为我根本就没有得到它。任何解释这一点的好文档的链接都会受到高度赞赏,为什么要使用它,当第二个例子更容易理解时。
答案 0 :(得分:1)
如果超类有额外的过滤,那么过滤器将通过调用super的get_queryset方法进行链接。这可能是一种罕见的情况,当需要多级继承时,但它会更干。
class CompanyListView(ListView):
def get_queryset(self):
queryset = super(CompanyListView, self).get_queryset()
return queryset.filter(company=self.company)
class EmployeeListView(CompanyListView):
def get_queryset(self):
queryset = super(EmployeeListView, self).get_queryset()
return queryset.filter(active=True)
class LocationListView(CompanyListView):
def get_queryset(self):
queryset = super(LocationListView, self).get_queryset()
return queryset.filter(published=True)