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

How do I tell if a Django QuerySet has been evaluated?

我正在手动创建一个 Django 查询集,并且只想使用 Django ORM 读取生成的结果 querset.query SQL 本身而不访问我的数据库。

我知道 Django 查询集是惰性的,我看到所有触发正在评估的查询集的操作:

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

但是...如果我只是想验证我的代码纯粹是在构建查询集胆量而不是无意中评估和访问我的数据库怎么办? queryset 对象上是否有任何属性我可以用来验证它没有被评估而不实际评估它?

对于使用 select 到 return 模型实例列表的查询集,如基本过滤器或排除,如果查询集具有 _result_cache 属性 None未被评估,或结果列表(如果已评估)。关于非 public 属性的常见注意事项适用。

请注意,打印一个查询集——尽管文档注意到调用 repr() 作为评估触发器——实际上并没有评估原始查询集。相反,在内部将原始查询集链接到一个新查询集,以便它可以在不更改原始查询集限制的情况下限制打印的数据量。确实,它评估了原始查询集的一个子集,因此命中了数据库,所以如果您实际上试图使用它来监视所有数据库流量,那么这是这种方法的另一个弱点。

对于其他查询集(计数、删除等),我不确定是否有简单的方法。也许观察你的数据库日志,或者 运行 在 DEBUG 模式下检查 connection.queries 如下所述: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running