1

多くの場合、次のように表示されます。

def get_queryset(self):
    queryset = super(SomeView, self).get_queryset()
    return queryset.filter(published=True)

これは、Django クラス ベースのビューでは一般的です。私が知りたいのは、これを行うことができるのに、なぜこれを行うのかということです:

queryset = someModel.objects.all().filter(args)

または、2 つの行を好む場合 (または、ここでは当てはまらない 1 つのライナーが好きだと思う場合):

all_the_stuff = someModel.objects.all()
the_stuff_we_want = all_the_stuff.filter(...)

super()また、呼び出しの背後にあるロジックが正確にどのように機能するのでしょうか。これを説明するいくつかの優れたドキュメントへのリンクは高く評価され、2番目の例がはるかに理解しやすいのに、なぜそれを使用するのか.

4

1 に答える 1

1

スーパー クラスに追加のフィルタリングがある場合、フィルターはスーパーの get_queryset メソッドを呼び出すことによって連鎖されます。複数レベルの継承が必要であるが、より DRY になる場合、これはまれなケースかもしれません。

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 に答える