有没有办法评估以下表达式?
instances = Catalog.objects.filter(q)
我试图对它进行分析,但由于它很懒,所以在它返回之前它实际上不会进行评估。我在想list(instances
),还有什么吗?
答案 0 :(得分:11)
以下是评估延迟查询集的所有方法。使用list
就是其中之一:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated
答案 1 :(得分:0)
使用list()
将评估查询,检索其所有结果,并将所有数据添加到QuerySet的缓存中。如果您实际上并不打算使用数据,则可能会产生大量开销。
您可以改用Catalog.objects.filter(q).exists()
(请参阅exists),它不需要获取整个结果集。只需注意它会执行一个不同的查询,该查询看起来像这样,具体取决于您的DBMS:
SELECT (1) AS "a" FROM "..._catalog" LIMIT 1;
如果您要评估与您最初执行的查询更接近的查询,则可以执行以下操作:
try:
Catalog.objects.filter(q)[0]
except IndexError:
pass
这仍将向您的查询中添加LIMIT
或TOP
,但至少您的查询仍将包括所有列和顺序,以使您的原始查询具有该功能。
您可能很想做类似bool(Catalog.objects.filter(q))
的事情,或者在布尔上下文中使用QuerySet,但是请注意,这将像list()
那样,获取整个结果集。