Выбор ответа 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, запроса нет.

Варианты ответа

  1. 0
  2. 2
  3. 1правильный ответ
  4. 3

Разбор

Цепочка filter().exclude().order_by() только строит QuerySet, запроса нет. SQL выполняется при первом обходе в for. Повторный обход того же объекта qs берёт результат из кеша QuerySet, поэтому второго запроса нет. Если бы второй цикл шёл по qs.filter(...) или Order.objects.filter(...) заново, был бы новый запрос.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.