Django 中 queryset 属性和 get_queryset() 方法的区别?
Difference between queryset attribute and get_queryset() method in django?
我正在学习 Django 中基于 class 的视图。我正在阅读 Django 文档并了解 queryset 属性和 get_queryset() 方法。当用谷歌搜索时,我遇到了这个 answer.
我尝试使用我的代码复制结果:
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
return Question.objects.order_by('-pub_date')[:2]
class IndexView2(generic.ListView):
template_name = 'polls/index2.html'
context_object_name = 'latest_question_list2'
queryset = Question.objects.all()
在回答中提到,当您设置查询集时,查询集只会在您启动服务器时创建一次。另一方面,每个请求都会调用 get_queryset 方法。
但我能够在数据库中插入问题并且它们在页面 index2.html 中可用而无需重新启动,我能够更改数据库并且更改在刷新后反映在页面 index2.html 上页面。
我进一步搜索并找到了这个 link。在 DRF 网站中,提到查询集将被评估一次,这些结果将被缓存以供所有后续请求使用。
你能指出我错在哪里吗? link 我错过了什么?
A QuerySet
被评估一次,但 get_queryset
的默认实现将使用 queryset.all()
,因此每次构造一个新的查询集将强制重新评估。
确实,implementation of the .get_queryset(…)
method [GitHub] 适用于:
def get_queryset(self):
if self.queryset is not None:
queryset = self.queryset
if isinstance(queryset, QuerySet):
queryset = <b>queryset.all()</b>
elif self.model is not None:
queryset = self.model._default_manager.all()
else:
raise ImproperlyConfigured(
"%(cls)s is missing a QuerySet. Define "
"%(cls)s.model, %(cls)s.queryset, or override "
"%(cls)s.get_queryset()." % {
'cls': self.__class__.__name__
}
)
ordering = self.get_ordering()
if ordering:
if isinstance(ordering, str):
ordering = (ordering,)
queryset = queryset.order_by(*ordering)
return queryset
这意味着我们每次都会对将要评估的 QuerySet
创建一个新的“副本”。如果未指定 queryset
,它将查找 model
属性,并使用该模型的 _default_manager
。
如果您指定了一个 ordering
属性,这意味着它也会对查询集进行排序。
我正在学习 Django 中基于 class 的视图。我正在阅读 Django 文档并了解 queryset 属性和 get_queryset() 方法。当用谷歌搜索时,我遇到了这个 answer.
我尝试使用我的代码复制结果:
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
return Question.objects.order_by('-pub_date')[:2]
class IndexView2(generic.ListView):
template_name = 'polls/index2.html'
context_object_name = 'latest_question_list2'
queryset = Question.objects.all()
在回答中提到,当您设置查询集时,查询集只会在您启动服务器时创建一次。另一方面,每个请求都会调用 get_queryset 方法。
但我能够在数据库中插入问题并且它们在页面 index2.html 中可用而无需重新启动,我能够更改数据库并且更改在刷新后反映在页面 index2.html 上页面。
我进一步搜索并找到了这个 link。在 DRF 网站中,提到查询集将被评估一次,这些结果将被缓存以供所有后续请求使用。
你能指出我错在哪里吗? link 我错过了什么?
A QuerySet
被评估一次,但 get_queryset
的默认实现将使用 queryset.all()
,因此每次构造一个新的查询集将强制重新评估。
确实,implementation of the .get_queryset(…)
method [GitHub] 适用于:
def get_queryset(self): if self.queryset is not None: queryset = self.queryset if isinstance(queryset, QuerySet): queryset = <b>queryset.all()</b> elif self.model is not None: queryset = self.model._default_manager.all() else: raise ImproperlyConfigured( "%(cls)s is missing a QuerySet. Define " "%(cls)s.model, %(cls)s.queryset, or override " "%(cls)s.get_queryset()." % { 'cls': self.__class__.__name__ } ) ordering = self.get_ordering() if ordering: if isinstance(ordering, str): ordering = (ordering,) queryset = queryset.order_by(*ordering) return queryset
这意味着我们每次都会对将要评估的 QuerySet
创建一个新的“副本”。如果未指定 queryset
,它将查找 model
属性,并使用该模型的 _default_manager
。
如果您指定了一个 ordering
属性,这意味着它也会对查询集进行排序。