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

yee*_*123 4 python django django-queryset django-views django-generic-views

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

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

我也用过这个:

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

并且在我看来也得到了同样的结果.我假设您可以使用查询集执行不同的操作?

Sim*_*ser 12

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

我们来看看代码吧.A 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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它首先查找self.queryset,如果不存在,则查找self.model.因此,指定列表有两种可能性:您可以自己提供查询集,也可以指定模型类(在这种情况下,Django将调用all()默认管理器的方法,即objects).

我假设您可以使用查询集执行不同的操作?

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