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 для работы" ... "перефразируем: заморожен на тот момент времени, и данные могли быть обновлены с тех пор"

Вернуться на верх