5

我是 Django 的新手,想知道在像 ListView 这样的通用视图中定义模型与查询集有什么区别。这是我在项目的 urls.py 文件中的代码示例:

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

并在我看来得到了相同的结果。我假设您可以使用查询集做不同的事情?

4

1 回答 1

13

使用model=Personqueryset=Person.objects.all给出相同的结果。

让我们看一下代码。AListView有以下方法:

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.querysetand,如果不存在,则查找self.model. 所以指定一个列表有两种可能:你可以自己提供一个查询集,或者你可以指定一个模型类(在这种情况下,Django 将调用all()默认管理器的方法,即objects)。

我假设您可以使用查询集做不同的事情?

是的。如果您指定 a model,则默认情况下您将获得所有实例。但是,如果您指定 a queryset,您还可以调用模型管理器的其他方法,例如Person.objects.children()只能返回带有 的人员age <= 12

于 2012-07-08T19:29:38.603 回答