如何判断是否已评估Django QuerySet?

slu*_*pet 11 django django-queryset

我正在手工创建一个Django查询集,并希望只使用Django ORM来读取生成的querset.query SQL本身,而无需访问我的数据库.

我知道Django quersets是懒惰的,我看到触发查询集的所有操作都被评估:

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

但是......如果我只是想验证我的代码是纯粹构建查询集内容但是不是在不经意间评估和命中我的数据库呢?在没有实际评估它的情况下,我可以用来验证它没有被评估的查询集对象上是否有任何属性?

Pet*_*per 11

对于使用a select返回模型实例列表的查询集(如基本过滤器或排除),该_result_cache属性是None尚未评估的查询集,或者是否具有结果列表.关于非公共属性的常见警告适用.

对于其他查询集(计数,删除等),我不确定有一种简单的方法.也许看你的数据库日志,或者在DEBUG模式下运行并connection.queries按照这里描述的那样进行检查:https: //docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries -django-是运行的

  • @LadenkovVladislav - 啊,这是你的问题。尝试使用 `len()` 或 `list()` 或其他东西来代替 `print()`。`print` 调用 `__repr__`,后者在查询集的切片上调用 `list()`。但是切片是通过以下方式实现的:如果“_result_cache”为空,则将原始查询集链接到一个新对象中,然后修改限制并填充新副本的“_result_cache”。https://github.com/django/django/blob/master/django/db/models/query.py#L303 我将更新以注意打印时不会修改此属性,因为文档将其列为评估扳机。 (5认同)