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=Person或queryset=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.