4

我在Django很新,想知道在像ListView這樣的通用視圖中定義模型與查詢集有什麼區別。這裏是我的代碼示例中的項目我的urls.py文件:Django - 查詢集與通用視圖中的模型

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', 
    )), 
) 

並收到了我的看法相同的結果。我假設你可以用一個查詢集做不同的事情?

回答

10

使用model=Personqueryset=Person.objects.all給出了相同的結果。

讓我們來看看代碼。一個ListView有以下方法:

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.queryset,如果不存在,self.model。所以有兩種可能性來指定一個列表:你可以自己提供一個查詢集,或者你可以指定一個模型類(在這種情況下,Django將調用默認管理器的all()方法,即objects)。

我假設你可以對查詢集做不同的事情?

是的。如果您指定model,則默認情況下會獲得所有實例。但是,如果您指定queryset,則還可以調用模型管理器的其他方法,例如Person.objects.children(),該方法可能只返回age <= 12的人員。

+0

好的,這是有道理的,謝謝! – yeenow123 2012-07-08 19:32:41