Добавление мини-кешей в модели Django - PullRequest
1 голос
/ 11 ноября 2009

У меня проблемы с производительностью в Django из-за отношений m2m. У меня есть список объектов Something, которые все имеют Something_instance.item_set, поэтому я вызываю Something_instance.item_set.all () много раз. Я хотел бы кэшировать этот запрос в Something_instance, чтобы мне не нужно было выполнять так много запросов. Это возможно? (По сути, это хак для того, чтобы заставить select_related () работать на m2m).

EDIT: Следующие 2 фрагмента показывают проблему, с которой я столкнулся. В views.py я запрашиваю отношения m2m.

    for t in items:
          try:
              t.price = t.user_item_rel_set.get(user=u).payment_amount
          except:
              t.price = -1 * t.buyer_item_rel_set.get(buyer=u).payment_amount
    return items

Также функция в моей модели:

def listBuyers(self):
    return self.buyer_item_rel_set.all()

У меня есть это, потому что я использую это в своем шаблоне, чтобы получить информацию от этих элементов.

Запрос отношений m2m заканчивается дважды: один раз в views.py, а затем один раз в шаблоне. Я хотел бы получить набор запросов в представлениях, прикрепить его к экземпляру модели, а затем передать его в шаблон, чтобы он (и код views.py) использовал кэшированный набор запросов, вместо повторной выборки.

Ответы [ 3 ]

4 голосов
/ 11 ноября 2009

Да, я делаю это все время. Используя ваш метод listBuyers в качестве примера (кстати, соглашение Pythonic будет называть его list_buyers ...)

def listBuyers(self):
    if not hasattr(self, '_buyers'):
        self._buyers = self.buyer_item_rel_set.all()
    return self._buyers

Это попадет в базу данных при первом вызове listBuyers для определенного экземпляра, но не после.

0 голосов
/ 11 ноября 2009

Трудно сказать, не видя ваших моделей и их отношений (например, как 't' связано с пользователем 'u')

Но предложение касается всех связанных с пользователем ('u') элементов в одном запросе, а затем идет один за другим и вычисляет необходимые вещи ...

Кстати ... 't' и 'u' не очень хорошие имена для переменных

0 голосов
/ 11 ноября 2009

Запрос уже кэширован. См. Django FAQ для получения информации о , как просмотреть SQL-запросы , которые генерируются во время загрузки страницы.

Проблема может заключаться в простом отсутствии индекса (хотя ORM Django должен генерировать необходимые индексы) или неэффективном коде с использованием результатов QuerySet. Нам понадобится гораздо больше информации для устранения неполадок.

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