Определите количество запросов к базе данных, выполненных в показанном фрагменте кода

После разделительной линии будет один SELECT: он выполняется при list(qs). Создание QuerySet и вызов filter без использования результата сами по себе запросов не выполняют.

Короткий ответ

Что ответить на собеседовании

После разделительной линии будет один SELECT: он выполняется при list(qs). Создание QuerySet и вызов filter без использования результата сами по себе запросов не выполняют.

Подробный разбор

Ответ с пояснениями

Условие

В данном примере создаются две записи в модели Post, после чего необходимо понять, сколько запросов к базе будет выполнено при работе с полученным набором данных.


Post.objects.create(name='a')
Post.objects.create(name='b')
———————————————
qs = Post.objects.all()
qs.filter(name__startswith='a')
list(qs)

Ответьте, сколько запросов к БД произойдёт после разделительной линии.

Ответ

После разделительной линии будет один SELECT: он выполняется при list(qs). Создание QuerySet и вызов filter без использования результата сами по себе запросов не выполняют.

QuerySet вычисляется лениво. В строке qs.filter(name__startswith='a') создаётся новый QuerySet, но он не сохраняется и не вычисляется. Исходный qs остаётся выборкой всех записей.

Поэтому list(qs) загрузит и 'a', и 'b' одним SELECT. Если считать две предшествующие операции create при обычной модели без дополнительных сигналов, получится ещё два INSERT, но они не входят в заданный интервал. Для реально отфильтрованного результата нужно присвоить qs = qs.filter(...), а затем вычислить его.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее