После разделительной линии будет один 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(...), а затем вычислить его.