@Animkim
Питон вокруг меня

Как уменьшить количество обращений к базе данных?select_related?

Правильно ли я понимаю что:
сat = Category.objects.get(id=1)
В шаблоне
cat.children.all()
cat.children.all()
cat.children.all()
cat.children.all()

Будет 4 обращения к базе данных, а если так:
сat = Category.objects.select_related().get(id=1)
в шаблоне
cat.children.all()
cat.children.all()
cat.children.all()
cat.children.all()

то одно? Или я ошибаюсь?
  • Вопрос задан
  • 521 просмотр
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Ошибаетесь. В первом случае будет два обращения - получение категории при вызове Category.objects.get(id=1) и получение её дочерних элементов при первом вызове cat.children.all(), а все последующие вызовы будут взяты из кэша ORM. Во втором select_related() будет проигнорирован, так как он используется для join'ов, а у вас children, скорее всего - записи из той же таблицы. select_related() помогает тогда, когда нужно считать данные двух связанных моделей одним запросом. Всё это очень просто и подробно описано в документации.

Очень помогает просветлению просмотр сделанных sql-запросов после операций с queryset'ами:
from django.db import connection
print(connection.queries)

Позволяет понять и сколько их было сделано, и какие конкретно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
un1t
@un1t
Посмотри на prefetch_related.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы