2013-05-29 3 views
1

을 많은 시간, 나는이를 참조하십시오의 검색어 장고의 일반적인 전망

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

이 장고 클래스를 기반으로보기에 일반적입니다. 내가 알고 싶은 무엇을 왜 우리가해야합니까, 우리가이 작업을 수행 할 수있을 때, 다음과 같습니다

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

또는 두 개의 라인을 선호 (또는 사건하지 않은, 단지 하나의 라이너처럼 생각하는 경우 여기에) : 나는 단순히 그것을 얻을하지 않기 때문에

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

또한, 어떻게 super() 호출 뒤에 논리는 정확히 작동 않습니다. 두 번째 예제가 훨씬 이해할 수있을 때 이것을 설명하는 좋은 문서에 대한 링크는 매우 높이 평가 될 것이며, 왜 그것을 사용해야할까요?

답변

1

수퍼 클래스에 추가 필터링이 있으면 super의 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)