【发布时间】:2014-12-02 23:20:39
【问题描述】:
Django 文档指定查询集何时被评估。
ValuesListQuerySet、ValuesQuerySet 何时评估? (什么时候到达数据库?)
【问题讨论】:
Django 文档指定查询集何时被评估。
ValuesListQuerySet、ValuesQuerySet 何时评估? (什么时候到达数据库?)
【问题讨论】:
根据文档,它是一个查询集:
返回一个
QuerySet,它返回字典,而不是模型 实例,当用作可迭代对象时。
您可以通过以下方式评估 QuerySet:
Iteration:QuerySet 是可迭代的,它会在您第一次迭代时执行其数据库查询。
Slicing:正如限制 QuerySets 中所解释的,可以使用 Python 的数组切片语法对 QuerySet 进行切片。对未计算的 QuerySet 进行切片通常会返回另一个未计算的 QuerySet,但如果您使用切片语法的“step”参数,Django 将执行数据库查询,并返回一个列表。对已评估的 QuerySet 进行切片也会返回一个列表。
Pickling/Caching:有关酸洗 QuerySet 时涉及的内容的详细信息,请参阅以下部分。就本节而言,重要的是从数据库中读取结果。
repr(): 查询集在您调用 repr() 时进行评估。这是为了方便 Python 交互式解释器,因此您可以在交互式使用 API 时立即看到结果。
len(): 查询集在您调用 len() 时进行评估。如您所料,这会返回结果列表的长度。
list(): 通过调用 list() 来强制评估 QuerySet。
bool():在布尔上下文中测试 QuerySet,例如使用 bool()、or、and 或 if 语句,将导致查询被执行。如果至少有一个结果,则 QuerySet 为 True,否则为 False。
【讨论】:
它的作用与任何普通的QuerySet 相同,只是它的输出在传递给您之前分别直接从模型实例转换为字典/元组,根据https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values
【讨论】: