在没有多次数据库请求的情况下在 Django 中多次调用外键对象
Calling foreign key object several times in Django without several DB requests
假设我有一个 class Child
通过 FK 链接到另一个 class Parent
。现在假设我有一段代码在模板中做这样的事情
<td>{{ child.parent.name }}</td>
<td>{{ child.parent.age}}</td>
<td>{{ child.parent.address }}</td>
我的第一个问题是,Django会不会去数据库里把Parent
实体读三遍?我的第二个问题是:如果是,最好不要多次阅读它的最佳做法是什么?我的意思是我知道我可以在此块之前声明一个对象并将其设置为等于 child.parent
但是还有另一种方法可以做到这一点吗?
不,Django 只会访问数据库一次,下次调用将使用缓存属性并且不需要访问数据库,您可以查看相关part 文档。
但是您可以使用 select_related
方法来改进这一点,在这种情况下,即使第一次调用也不会命中数据库,因为 child.parent
将被预缓存。
在您看来,像这样获取 Child 对象:
children = Child.objects.select_related('parent').all()
为了补充 neverwalkaloner 的答案,您还可以在模板中使用别名 child.parent
以避免查找成本:
{% with parent=child.parent %}
<td>{{ parent.name }}</td>
<td>{{ parent.age}}</td>
<td>{{ parent.address }}</td>
{% endwith %}
假设我有一个 class Child
通过 FK 链接到另一个 class Parent
。现在假设我有一段代码在模板中做这样的事情
<td>{{ child.parent.name }}</td>
<td>{{ child.parent.age}}</td>
<td>{{ child.parent.address }}</td>
我的第一个问题是,Django会不会去数据库里把Parent
实体读三遍?我的第二个问题是:如果是,最好不要多次阅读它的最佳做法是什么?我的意思是我知道我可以在此块之前声明一个对象并将其设置为等于 child.parent
但是还有另一种方法可以做到这一点吗?
不,Django 只会访问数据库一次,下次调用将使用缓存属性并且不需要访问数据库,您可以查看相关part 文档。
但是您可以使用 select_related
方法来改进这一点,在这种情况下,即使第一次调用也不会命中数据库,因为 child.parent
将被预缓存。
在您看来,像这样获取 Child 对象:
children = Child.objects.select_related('parent').all()
为了补充 neverwalkaloner 的答案,您还可以在模板中使用别名 child.parent
以避免查找成本:
{% with parent=child.parent %}
<td>{{ parent.name }}</td>
<td>{{ parent.age}}</td>
<td>{{ parent.address }}</td>
{% endwith %}