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

时间:2016-11-15 19:12:17

标签: 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

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

2 个答案:

答案 0 :(得分:9)

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

对于其他查询集(计数,删除等),我不确定有一种简单的方法。也许会查看您的数据库日志,或以DEBUG模式运行并按照此处所述检查connection.querieshttps://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

答案 1 :(得分:1)

对于那些想要了解何时评估 QuerySet的人:当他们迭代切片腌制或缓存 repr()'d, len()'d, list()'ed或 bool()'ed。 见https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated