Сопоставление Middle Django ORM и N+1 обновлено
Методы QuerySet и их назначение
Вопрос
Сопоставьте метод QuerySet и его назначение.
Попробуйте сами
Нажмите слева, потом подходящее справа.
Показать ответ и разбор
Коротко
annotate возвращает QuerySet с дополнительным полем у каждого объекта, aggregate сразу выполняет запрос и возвращает словарь. only загружает часть колонок, обращение к остальным вызовет дополнительный запрос на объект, это тоже может дать N+1.
Правильные пары
select_relatedJOIN для связи «к одному»prefetch_relatedОтдельный запрос для связи «ко многим»annotateДобавить вычисляемое поле к каждой строкеaggregateВернуть словарь итогов по всей выборкеselect_for_updateЗаблокировать строки до конца транзакцииonlyЗагрузить только указанные колонкиРазбор
annotate возвращает QuerySet с дополнительным полем у каждого объекта, aggregate сразу выполняет запрос и возвращает словарь. only загружает часть колонок, обращение к остальным вызовет дополнительный запрос на объект, это тоже может дать N+1.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Django ORM и N+1»
- Задвоение сумм при нескольких annotate
- Посчитать SQL-запросы при ленивой загрузке
- Как prefetch_related склеивает данные
- exists() и count() вместо загрузки строк
- Атомарное увеличение счётчика
- Prefetch с вложенным select_related
- transaction.atomic
- Когда выполняется QuerySet