当前位置: 首页 > 知识库问答 >
问题:

Django中的queryset属性和get_queryset()方法之间的区别?

马阳曦
2023-03-14

我正在学习基于Django的课堂观点。我正在阅读Django文档,了解了queryset属性和get_queryset()方法。在谷歌搜索它们时,我发现了这个答案。

我试图用我的代码复制结果:

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()

在回答中提到,当您设置queryset时,只在启动服务器时创建一次queryset。另一方面,对每个请求都调用get_queryset方法。

但是我可以在数据库中插入问题,并且它们可以在页面index2.html中使用,而不需要重新启动,我可以更改数据库,并且在刷新页面后更改会反映在页面index2.html中。

我进一步谷歌,找到了这个链接。在DRF网站中提到,queryset将得到一次评估,那些结果将被缓存用于所有后续请求。

你能指出我哪里错了吗?我缺了什么环节?

共有1个答案

耿玄裳
2023-03-14

queryset只计算一次,但get_queryset的默认实现将使用queryset.all(),因此每次都构造一个新的queryset,强制重新计算。

确实,.get_queryset(…)方法[GitHub]的实现与以下条件一起工作:

def get_queryset(self):
    if self.queryset is not None:
        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            queryset = queryset.all()
    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属性,则这意味着它也将对QuerySet进行排序

 类似资料:
  • 问题内容: 之间有什么区别 和 问题答案: 在Django的查询集文档都对这个很清楚的: 返回与给定查找参数匹配的对象,该参数应采用“字段查找”中所述的格式。 如果找到多个对象,则get()会引发MultipleObjectsReturned。MultipleObjectsReturned异常是模型类的属性。 如果找不到给定参数的对象,则get()会引发DidNotExist异常。此异常也是模型类

  • 问题内容: Django 有两种方法,和。该文档说: 与gregation()不同,annotate()不是终端子句。annotate()子句的输出是QuerySet。 它们之间还有其他区别吗?如果没有,那为什么存在呢? 问题答案: 我将重点放在示例查询而不是文档中的引用上。A计算整个查询集的值。计算查询集中每个项目的汇总值。 聚合 返回包含查询集中所有书籍的平均价格的字典。 注解 q 是书籍的查

  • 问题内容: 和属性有什么区别?它们似乎都具有提供标识符的相同目的。 我想知道(特别是关于HTML表单)出于某种原因是否有必要或同时使用两者。 问题答案: 在表单提交中发送数据时使用该属性。不同的控件反应不同。例如,您可能有几个单选按钮,它们具有不同的属性,但属性相同。提交后,响应中只有一个值- 您选择的单选按钮。 当然,这还不止于此,但是它一定会让您思考正确的方向。

  • 问题内容: 对于“属性”和“属性”之间的区别,我通常感到困惑,并且找不到很好的资源来简洁地详细说明这些区别。 问题答案: 属性是一种特殊的属性。基本上,当Python遇到以下代码时: 它查找中,然后检查,看它是否有一个,或方法- 如果这样做,这是一个性质。如果它 是 一个属性,则不仅会返回该对象(就像对其他任何属性一样),还会调用该方法(因为我们一直在进行查找),并返回该方法返回的内容。 有关Py

  • 本文向大家介绍综合属性和继承属性之间的区别,包括了综合属性和继承属性之间的区别的使用技巧和注意事项,需要的朋友参考一下 合成属性和继承属性都是语言语义的一部分,该语言为其构造提供含义,例如标记和语法结构。语义有助于解释符号,符号的类型及其相互之间的关系,其分析可判断源程序中构造的语法结构是否衍生出任何含义。现在,基于属性的特征,我们可以区分综合属性和继承属性 以下是合成属性和继承属性之间的重要区别

  • 问题内容: 使用与外观相当相似。 两者有什么区别? 问题答案: 该文件充分说明了这一点。是一个完整的用户模型,具有作为抽象类的字段,因此你可以从中继承并添加自己的配置文件字段和方法。仅包含身份验证功能,但不包含实际字段:在子类化时必须提供它们。