Ваш упрощенный код, вероятно, скрывает проблему, поскольку описанное вами поведение не должно происходить.Вся цель тега шаблона with
состоит в том, чтобы кэшировать результаты дорогостоящего метода для последующего использования.
Однако ваш метод, item_objects
, возвращает QuerySet
, и когда вы присваиваете егоitem_object
, это все еще QuerySet
.QuerySet
s загружаются лениво, поэтому до этого момента обращения к базе данных не производились.В результате, в зависимости от того, что вы на самом деле делаете с item_object
, вы можете отрицательно повлиять на производительность запроса.
Например, следующее приведет к двум запросам к БД, дажехотя вы имеете дело с кэшированным QuerySet
:
{{ item_object.count }}
{{ item_object|first }}
Вы должны быть осторожны с тем, какие операции вы выполняете над наборами запросов и в каком порядке.Например, если вы знаете, что в какой-то момент вы собираетесь циклически проходить по набору запросов, но сначала вам нужен счетчик, на самом деле более эффективно использовать {{ item_object|length }}
вместо {{ item_object.count }}