强制评估延迟查询

时间:2015-03-05 22:40:09

标签: python django

有没有办法评估以下表达式?

instances = Catalog.objects.filter(q)

我试图对它进行分析,但由于它很懒,所以在它返回之前它实际上不会进行评估。我在想list(instances),还有什么吗?

2 个答案:

答案 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

这仍将向您的查询中添加LIMITTOP,但至少您的查询仍将包括所有列和顺序,以使您的原始查询具有该功能。

您可能很想做类似bool(Catalog.objects.filter(q))的事情,或者在布尔上下文中使用QuerySet,但是请注意,这将像list()那样,获取整个结果集。