select_related добавляет JOIN и загружает связанные объекты в одном SQL; prefetch_related выполняет дополнительные запросы и связывает результаты в Python. Оба меняют план загрузки ленивого QuerySet.
Расскажи подробнее, как select_related и prefetch_related устроены под капотом — что происходит, когда вызываешь тот или иной метод.
select_related добавляет JOIN и загружает связанные объекты в одном SQL; prefetch_related выполняет дополнительные запросы и связывает результаты в Python. Оба меняют план загрузки ленивого QuerySet.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
select_related добавляет JOIN и загружает связанные объекты в одном SQL; prefetch_related выполняет дополнительные запросы и связывает результаты в Python. Оба меняют план загрузки ленивого QuerySet.
select_related подходит для одиночных связей ForeignKey и OneToOne: поля связанных строк входят в основной результат. Prefetch удобен для обратных и many-to-many связей, где JOIN размножил бы строки. Он собирает связанные записи для выбранных родителей и заполняет кеш отношений. Цена — дополнительная память и запросы; последующий иной фильтр может не использовать этот кеш. Сам вызов метода обычно не выполняет SQL: работа начинается при вычислении QuerySet. Выбор проверяют по реальному шаблону доступа.