【问题标题】:When does django's values() values_list() get evaluated?django 的 values() values_list() 什么时候被评估?
【发布时间】:2014-12-02 23:20:39
【问题描述】:

Django 文档指定查询集何时被评估。

ValuesListQuerySet、ValuesQuerySet 何时评估? (什么时候到达数据库?)

【问题讨论】:

    标签: django database


    【解决方案1】:

    根据文档,它是一个查询集:

    返回一个QuerySet,它返回字典,而不是模型 实例,当用作可迭代对象时。

    In addition:

    您可以通过以下方式评估 QuerySet:

    1. Iteration:QuerySet 是可迭代的,它会在您第一次迭代时执行其数据库查询。

    2. Slicing:正如限制 QuerySets 中所解释的,可以使用 Python 的数组切片语法对 QuerySet 进行切片。对未计算的 QuerySet 进行切片通常会返回另一个未计算的 QuerySet,但如果您使用切片语法的“step”参数,Django 将执行数据库查询,并返回一个列表。对已评估的 QuerySet 进行切片也会返回一个列表。

    3. Pickling/Caching:有关酸洗 QuerySet 时涉及的内容的详细信息,请参阅以下部分。就本节而言,重要的是从数据库中读取结果。

    4. repr(): 查询集在您调用 repr() 时进行评估。这是为了方便 Python 交互式解释器,因此您可以在交互式使用 API 时立即看到结果。

    5. len(): 查询集在您调用 len() 时进行评估。如您所料,这会返回结果列表的长度。

    6. list(): 通过调用 list() 来强制评估 QuerySet。

    7. bool():在布尔上下文中测试 QuerySet,例如使用 bool()、or、and 或 if 语句,将导致查询被执行。如果至少有一个结果,则 QuerySet 为 True,否则为 False。

    【讨论】:

      【解决方案2】:

      它的作用与任何普通的QuerySet 相同,只是它的输出在传递给您之前分别直接从模型实例转换为字典/元组,根据https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

      【讨论】:

      • 哦,真的吗?这是否意味着,我可以将 MyClass.objects.filter(a=a).select_related().values_list('foreign_key_field', flat=True) 传递给分页器以获取外键字段对象的分页结果?在一个分贝命中?
      • 你应该是的,它只是一个普通的查询集,为了你的方便而处理了输出。
      猜你喜欢
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2017-07-22
      • 2021-05-15
      • 2020-04-03
      相关资源
      最近更新 更多