1

很多时候,我看到这个:

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()究竟是如何工作的,因为我根本不明白。任何指向解释这一点的优秀文档的链接都将受到高度赞赏,以及为什么要使用它,因为第二个示例更容易理解。

4

1 回答 1

1

如果超类有额外的过滤,那么过滤器将通过调用超的 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)
于 2013-05-29T18:27:01.767 回答