我是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',
)),
)
我的观点得到了同样的结果。我假设您可以使用查询集执行不同的操作吗?
答案 0 :(得分:12)
使用model=Person
或queryset=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
的人。