是django模型查询缓存?

时间:2017-11-29 15:15:02

标签: python django django-models

我们说model_amodel_b的外键,我正在访问model_b的属性,如下所示:

model_a = ModelA.objects.get(id=id)

x = model_a.model_b.x
y = model_a.model_b.y
z = model_a.model_b.z

Django是否会访问数据库并加入表格以获得每行的xyz字段?或者Django存储第一个连接的结果,然后不再需要连接?

这在性能方面有何不同?

model_b = model_a.model_b  # only one join
x = model_b.x
y = model_b.y
z = model_b.z

好奇的

1 个答案:

答案 0 :(得分:0)

你可以see the SQL queries {Django connection.queries。{/ 3>

from django.db import connection
model_a = ModelA.objects.get(id=1)
x = model_a.model_b.x
y = model_a.model_b.y
z = model_a.model_b.z
print(connection.queries)

这应该会显示两个查询,一个用于提取model_a,另一个用于提取model_b。 Django缓存model_a.model_b,因此y = model_a.model_b.y model_a.model_b.z不会导致model_b的进一步查找。有关详细信息,请参阅understanding cached attributes上的文档。

您可能还会发现调试工具栏对于查看正在运行的SQL查询非常有用。

减少SQL查询的最重要工具是use select_related and prefetch_related。对于您的示例,您可以使用select_related。由于您要获取单个ModelA实例,因此它会将查询数量从两个减少到一个,因此它可能不会对性能产生明显的影响。

model_a = ModelA.objects.select_related('model_b').get(id=1)
x = model_a.model_b.x