python - 评估一个数据库命中中的整个 django 查询集

标签 python django

我正在寻找一种方法来评估一个数据库命中中的整个 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/

相关文章:

Django - ModelForm 创建还是更新?

python - 如何使 Django 中的代码仅在 debug 设置为 true 时运行

mysql - 选择具有几个相同参数的行

python - 从 python 启动高斯作业并等待 .log 完成(多次运行)

python - 如何测试创建目录的函数?

python - 如何检查列表的元素是否为数字?

python - 如何将测试方法添加到一组 Django TestCase 派生类中?

Python使用pandas将numpy数组插入sqlite3数据库

python - Pypi:我可以声称自己是未维护包的新维护者吗?

django - 在南迁移运行之前加载 fixture