在没有多个数据库请求的情况下在Django中多次调用外键对象

时间:2018-05-03 10:19:10

标签: python django django-models django-database

假设我有一个班级Child通过FK链接到另一个班级Parent。现在假设我有一段代码在模板中执行类似的操作

<td>{{ child.parent.name }}</td>
<td>{{ child.parent.age}}</td>
<td>{{ child.parent.address }}</td>

我的第一个问题是,Django会去数据库并三次阅读Parent实体吗?我的第二个问题是:如果是,那么多次不读它的最佳做法是什么?我的意思是我知道我可以在这个块之前声明一个对象并将其设置为child.parent但是还有另一种方法吗?

3 个答案:

答案 0 :(得分:3)

不,Django只会命中一次DB,下一次调用将使用缓存属性并且不会重新获取对DB的访问权限,您可以查看相关的part文档。

但是你可以使用select_related方法来促进这一点,在这种情况下,即使第一次调用也不会命中DB,因为child.parent将被预先缓存。

答案 1 :(得分:2)

使用select_related

在您的视图中,获取这样的Child对象:

children = Child.objects.select_related('parent').all()

答案 2 :(得分:1)

为了补充neverwalkaloner的答案,您还可以在模板中使用child.parent作为别名,以避免查询费用:

{% with parent=child.parent %}
<td>{{ parent.name }}</td>
<td>{{ parent.age}}</td>
<td>{{ parent.address }}</td>
{% endwith %}