4

Django의 새로운 점은 ListView와 같은 일반적인 뷰에서 모델 대 쿼리 세트를 정의하는 것의 차이점이 무엇인지 궁금합니다. 여기 내 코드 예제는 프로젝트 내 urls.py 파일입니다 :Django-queryset 대 Generic View의 모델

urlpatterns = patterns('', 
    url(r'^$', ListView.as_view(
    model=Person, 
    context_object_name='people', 
    template_name='index.html', 
    )), 
) 

나는이 같은 사용했습니다 :

urlpatterns = patterns('', 
    url(r'^$', ListView.as_view(
    queryset=Person.objects.all, 
    context_object_name='people', 
    template_name='index.html', 
    )), 
) 

을 그리고 내보기에 같은 결과를 받았다. 나는 당신이 queryset으로 할 수있는 다른 것들이 있다고 가정하고 있습니까?

답변

10

model=Person 또는 queryset=Person.objects.all을 사용하면 같은 결과가 나타납니다.

코드를 살펴 보겠습니다. 즉 존재하지 않는 경우 당신이 볼 수 있듯이

def get_queryset(self): 
    """ 
    Get the list of items for this view. This must be an interable, and may 
    be a queryset (in which qs-specific behavior will be enabled). 
    """ 
    if self.queryset is not None: 
     queryset = self.queryset 
     if hasattr(queryset, '_clone'): 
      queryset = queryset._clone() 
    elif self.model is not None: 
     queryset = self.model._default_manager.all() 
    else: 
     raise ImproperlyConfigured(u"'%s' must define 'queryset' or 'model'" 
            % self.__class__.__name__) 
    return queryset 

이 처음 self.model를 들어, self.queryset을 찾고, • ListView는 다음과 같은 방법이있다. 따라서 목록을 지정하는 방법은 두 가지가 있습니다. 사용자가 직접 쿼리 세트를 제공하거나 모델 클래스를 지정할 수 있습니다 (이 경우 Django는 objects이라는 기본 관리자의 all() 메소드를 호출합니다).

저는 쿼리 세트로 할 수있는 다른 것들이 있다고 가정하고 있습니까?

예. model을 지정하면 기본적으로 모든 인스턴스가 생성됩니다. 그러나 queryset을 지정하면 모델 관리자의 다른 메소드 (예 : Person.objects.children())를 호출하여 age <= 12 인원 만 리턴 할 수 있습니다.

+0

좋습니다. 감사합니다. – yeenow123