django通用视图中的Queryset

时间:2013-05-29 17:50:29

标签: django django-views

很多时候,我看到了这一点:

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()调用背后的逻辑如何正常工作,因为我根本就没有得到它。任何解释这一点的好文档的链接都会受到高度赞赏,为什么要使用它,当第二个例子更容易理解时。

1 个答案:

答案 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)