我们说model_a
有model_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是否会访问数据库并加入表格以获得每行的x
,y
和z
字段?或者Django存储第一个连接的结果,然后不再需要连接?
这在性能方面有何不同?
model_b = model_a.model_b # only one join
x = model_b.x
y = model_b.y
z = model_b.z
好奇的
答案 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