使用 get_queryset() 方法还是设置 queryset 变量? [英] Use get_queryset() method or set queryset variable?

查看:37
本文介绍了使用 get_queryset() 方法还是设置 queryset 变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这两段代码乍一看是一样的:

These two pieces of code are identical at the first blush:

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]

它们之间有什么区别吗?如果是:

Is there any difference between them? And if it is:

哪种方法更好?或者当设置 queryset 变量比覆盖 get_queryset 方法更好?反之亦然.

What approach is better? Or when setting queryset variable is better than override the get_queryset method? And vice versa.

推荐答案

在您的示例中,覆盖 querysetget_queryset 具有相同的效果.我稍微倾向于设置 queryset 因为它不那么冗长.

In your example, overriding queryset and get_queryset have the same effect. I would slightly favour setting queryset because it's less verbose.

当您设置 queryset 时,查询集只会在您启动服务器时创建一次.另一方面,每个请求都会调用 get_queryset 方法.

When you set queryset, the queryset is created only once, when you start your server. On the other hand, the get_queryset method is called for every request.

这意味着如果您想动态调整查询,get_queryset 很有用.例如,您可以返回属于当前用户的对象:

That means that get_queryset is useful if you want to adjust the query dynamically. For example, you could return objects that belong to the current user:

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 有用的例子是当你想根据一个可调用对象进行过滤时,例如,返回今天的民意调查:

Another example where get_queryset is useful is when you want to filter based on a callable, for example, return today's polls:

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() 只会在视图加载时被调用一次,并且视图一段时间后会显示不正确的结果.

If you tried to do the same thing by setting queryset, then date.today() would only be called once, when the view was loaded, and the view would display incorrect results after a while.

class IndexView(generic.ListView):
    # don't do this!
    queryset = Poll.active.filter(pub_date=date.today())

这篇关于使用 get_queryset() 方法还是设置 queryset 变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆