我正在寻找一种方法来评估一个数据库命中中的整个 django 查询集。
我正在使用 Django 2.0.8 和 Python 3.6.5。
我曾经评估列出它们的查询集:
queryset = Model.objects.all()
# len(connection.queries) = 0
list(queryset)
# len(connection.queries) = 87
len(queryset) = 43
仅执行一次数据库命中。但现在看来,这对数据库的访问次数超过了 n 次 -n 是查询集的长度 - 当 n 时,这是一个问题> 很大,数据库点击成本很高。
谢谢
最佳答案
简短回答:您的假设是错误。如果您评估查询集,您将立即获取一个查询中的所有结果。
因此,对于 list(..)
(在其中枚举查询集),Django 将首先进行查询,使用该查询获取所有记录,然后反序列化所有行,并将其放入列表中。
然而,存在线性行为,因为答案的大小将随着记录的数量而变化,反序列化它并将其放入列表中的工作量也会随着行数的变化而变化。
如果您的查询有 prefetch_lated
调用,这也会导致一些额外的查询,但这些(查询的数量)通常会线性扩展 em> 是 prefeches 的数量,而不是记录的数量。
如果您计划获取大量外键,例如:
for obj in Model.objects.all():
print(obj.some_reversefk.all())
然后,这将针对每个对象进行查询,以获取相关对象(外键指向的对象)。
为避免这种情况,您可以使用 .select_lated(..)
和 .prefetch_lated(..)
。 .prefetch_lated(..)
将进行一两个额外的查询,但会立即获取所有相关对象。所以你可以使用:
Model.objects.prefetch_related('some_m2m')
关于python - 评估一个数据库命中中的整个 django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52516549/