У меня есть модель Invoice
, и я хочу сохранить total
в актуальном состоянии. Поэтому я добавил свойство, как этотDjango: кэширование агрегированного запроса?
@property
def item_total(self):
if not hasattr(self, 'item_total_cache'):
self.item_total_cache = self.items.aggregate(t=Sum('amount'))['t']
return self.item_total_cache
Поскольку item_total
может вызываться несколько раз в течение одного запроса страницы, и я не хочу попасть в БД каждый раз. Это хороший способ сделать это? Будет ли мой объект Invoice
существовать за пределами одного запроса страницы, и, таким образом, item_total
может действительно устареть?
В идеале, я хотел бы вычислить item_total
в то же время, когда запрашиваются счета ... Я знаю, что могу сделать это вручную, но, например, сайт администратора Django не знает, что он понадобится сумма. Есть ли какой-то способ «вставить» этот лишний лакомый кусочек информации, чтобы все запросы Invoice.objects.all/filter/get()
запускали агрегат одновременно?
Забыл я мог переопределить менеджера ... никогда не нужно было делать это раньше. Это должно хорошо работать!Рад, что мое текущее решение не так ужасно; может отложить это до тех пор, пока не будут выполнены более неотложные функции :) – mpen