这两段代码乍一看是相同的:
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_poll_list'
queryset = Poll.active.order_by('-pub_date')[:5]
和
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_poll_list'
def get_queryset(self):
return Poll.active.order_by('-pub_date')[:5]
它们之间有什么区别吗?如果是:
哪种方法更好?或者设置 queryset
变量比覆盖 get_queryset
方法更好?反之亦然。
最佳答案
在您的示例中,覆盖 queryset
和 get_queryset
具有相同的效果。我稍微倾向于设置 queryset
,因为它不那么冗长。
当您设置queryset
时,查询集只会在您启动服务器时创建一次。另一方面,每个请求都会调用 get_queryset
方法。
这意味着如果您想动态调整查询,get_queryset
很有用。例如,您可以返回属于当前用户的对象:
class IndexView(generic.ListView):
def get_queryset(self):
"""Returns Polls that belong to the current user"""
return Poll.active.filter(user=self.request.user).order_by('-pub_date')[:5]
另一个 get_queryset
有用的例子是当你想根据可调用的对象进行过滤时,例如,返回今天的民意调查:
class IndexView(generic.ListView):
def get_queryset(self):
"""Returns Polls that were created today"""
return Poll.active.filter(pub_date=date.today())
如果您尝试通过设置 queryset
来做同样的事情,那么 date.today()
只会在加载 View 时调用一次,并且 View 一段时间后会显示不正确的结果。
class IndexView(generic.ListView):
# don't do this!
queryset = Poll.active.filter(pub_date=date.today())
关于django - 使用 get_queryset() 方法或设置查询集变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19707237/