Вызов объекта внешнего ключа несколько раз в Django без нескольких запросов БД - PullRequest
0 голосов
/ 03 мая 2018

Допустим, у меня есть класс Child, связанный через FK с другим классом Parent. Теперь допустим, что у меня есть блок кода, который делает что-то подобное в шаблоне

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

Мой первый вопрос: пойдет ли Django в базу данных и прочитает объект Parent три раза? Мой второй вопрос: если да, то как лучше не читать его несколько раз? Я имею в виду, я знаю, что могу объявить объект перед этим блоком и установить его равным child.parent, но есть ли другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Использование select_related

По вашему мнению, возьмите дочерние объекты, как это:

children = Child.objects.select_related('parent').all()
0 голосов
/ 03 мая 2018

Чтобы дополнить ответ neverwalkaloner, вы также можете использовать псевдоним child.parent в своем шаблоне, чтобы избежать затрат на поиск:

{% with parent=child.parent %}
<td>{{ parent.name }}</td>
<td>{{ parent.age}}</td>
<td>{{ parent.address }}</td>
{% endwith %}
0 голосов
/ 03 мая 2018

Нет, Django ударит по БД только один раз, при следующем вызове будет использоваться кэшированный атрибут и не будет запрашиваться доступ к БД, вы можете проверить соответствующую часть документации.

Но вы можете навязать это с помощью метода select_related, в этом случае даже первый вызов не попадет в БД, так как child.parent будет пропрошен.

...