Выбор ответа Junior Django ORM и N+1 спрашивают часто обновлено
Когда QuerySet выполняет SQL
Вопрос
Сколько SQL-запросов выполнит код?
qs = Order.objects.filter(status='paid').exclude(total=0).order_by('-id')
for o in qs:
print(o.id)
for o in qs:
print(o.total)
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: 1. Цепочка filter().exclude().orderby() только строит QuerySet, запроса нет.
Варианты ответа
- 0
- 2
- 1правильный ответ
- 3
Разбор
Цепочка filter().exclude().order_by() только строит QuerySet, запроса нет. SQL выполняется при первом обходе в for. Повторный обход того же объекта qs берёт результат из кеша QuerySet, поэтому второго запроса нет. Если бы второй цикл шёл по qs.filter(...) или Order.objects.filter(...) заново, был бы новый запрос.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Django ORM и N+1»
- Задвоение сумм при нескольких annotate
- Посчитать SQL-запросы при ленивой загрузке
- Как prefetch_related склеивает данные
- exists() и count() вместо загрузки строк
- Атомарное увеличение счётчика
- Prefetch с вложенным select_related
- transaction.atomic
- Когда выполняется QuerySet