Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中多次调用外键对象而无需多次DB请求_Python_Django_Django Models_Django Database - Fatal编程技术网

Python 在Django中多次调用外键对象而无需多次DB请求

Python 在Django中多次调用外键对象而无需多次DB请求,python,django,django-models,django-database,Python,Django,Django Models,Django Database,假设我有一个类子类通过FK链接到另一个类父类。现在让我们假设我有一块代码在模板中执行类似的操作 <td>{{ child.parent.name }}</td> <td>{{ child.parent.age}}</td> <td>{{ child.parent.address }}</td> {{child.parent.name} {{child.parent.age} {{child.parent.address}

假设我有一个类
子类
通过FK链接到另一个类
父类
。现在让我们假设我有一块代码在模板中执行类似的操作

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

我的第一个问题是,Django会去数据库并读取父实体三次吗?我的第二个问题是:如果是的话,最好的做法是不反复阅读?我的意思是,我知道我可以在此块之前声明一个对象,并将其设置为等于
child.parent
,但还有其他方法吗?

没有,Django只会命中DB一次,下一次调用将使用cached属性,不需要访问DB,您可以查看相关文档

但您可以通过使用方法来实现这一点,在这种情况下,即使第一次调用也不会命中DB,因为
child.parent
将被预先缓存。

使用

在视图中,获取如下子对象:

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

为了补充NeverMoner的答案,您还可以在模板中别名
child.parent
,以避免查找成本:

{% with parent=child.parent %}
<td>{{ parent.name }}</td>
<td>{{ parent.age}}</td>
<td>{{ parent.address }}</td>
{% endwith %}
{%with parent=child.parent%}
{{parent.name}
{{parent.age}
{{parent.address}
{%endwith%}
查看与选择相关的: