проблемы с тегом 'with' в django - PullRequest
2 голосов
/ 14 марта 2012

У меня есть модель "Счет-фактура" с методом

def item_objects(self):
    return self.invoiceitem_set.filter(kind='item')

У меня есть шаблон с этой моделью в контексте "invoice"

в этом шаблоне я использую тег с, чтобы попытаться кэшировать этот item_objects

{% with item_object=invoice.item_objects%}
    {{item_object}}
    {{item_object}}
{% endwith %}

Несмотря на это, я все еще беру базу данных каждый раз, когда звоню {{item_object}}

Что я делаю не так?

1 Ответ

1 голос
/ 14 марта 2012

Ваш упрощенный код, вероятно, скрывает проблему, поскольку описанное вами поведение не должно происходить.Вся цель тега шаблона with состоит в том, чтобы кэшировать результаты дорогостоящего метода для последующего использования.

Однако ваш метод, item_objects, возвращает QuerySet, и когда вы присваиваете егоitem_object, это все еще QuerySet.QuerySet s загружаются лениво, поэтому до этого момента обращения к базе данных не производились.В результате, в зависимости от того, что вы на самом деле делаете с item_object, вы можете отрицательно повлиять на производительность запроса.

Например, следующее приведет к двум запросам к БД, дажехотя вы имеете дело с кэшированным QuerySet:

{{ item_object.count }}
{{ item_object|first }}

Вы должны быть осторожны с тем, какие операции вы выполняете над наборами запросов и в каком порядке.Например, если вы знаете, что в какой-то момент вы собираетесь циклически проходить по набору запросов, но сначала вам нужен счетчик, на самом деле более эффективно использовать {{ item_object|length }} вместо {{ item_object.count }}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...