Django - 查询集与通用视图中的模型

时间:2012-07-08 19:24:53

标签: python django django-views django-queryset django-generic-views

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

我的观点得到了同样的结果。我假设您可以使用查询集执行不同的操作吗?

1 个答案:

答案 0 :(得分:12)

使用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的人。