Django: Запрос .all() не попадает в базу данных
В документации django говорится:
Возвращает копию текущего QuerySet (или подкласса QuerySet). Это может быть полезно в ситуациях, когда вы хотите передать либо менеджер моделей, либо QuerySet и выполнить дальнейшую фильтрацию результата. После вызова all() на любом из объектов у вас определенно будет QuerySet для работы.
.Когда QuerySet оценивается, он обычно кэширует свои результаты. Если данные в базе данных могли измениться с момента оценки QuerySet, вы можете получить обновленные результаты для того же запроса, вызвав all() для ранее оцененного QuerySet.
Я использую Django-Debug-Toolbar для оптимизации запроса.
Если у меня есть код вроде этого (возвращающий пустой список, чтобы убедиться, что .all() попадает в БД в данный момент времени:
def get_querysets():
foo_list = Foo.objects.filter(...).all()
bar_list = Bar.objects.filter(...).all()
caz_list = Caz.objects.filter(...).all()
return []
тогда панель отладки Django не зарегистрирует эти запросы, т.е. БД не была запрошена.
Однако если я изменю его на:
def get_querysets():
foo_list = Foo.objects.filter(...).all()
bar_list = Bar.objects.filter(...).all()
caz_list = Caz.objects.filter(...).all()
print(foo_list)
print(bar_list)
print(caz_list)
return []
Теперь в панели инструментов я могу видеть запросы. Я знаю, что кверисеты ленивы, но весь смысл .all() в том, чтобы заставить его обращаться к базе данных и кэшировать результаты.
Почему поведение отличается от док-тов: "После вызова all() на любом из объектов у вас определенно будет QuerySet для работы" ... "перефразируем: заморожен на тот момент времени, и данные могли быть обновлены с тех пор"