Пользовательский менеджер набора запросов Django - обновить кеширование - PullRequest
4 голосов
/ 25 октября 2010

В моей модели userprofile у меня есть метод (превращенный в свойство), который возвращает набор запросов на основе собственного менеджера другой модели.

Конкретно, пользователь может продавать не скоропортящиеся и скоропортящиеся товары, а на уровне модели элементов действуют несколько пользовательских менеджеров, которые содержат логику (и возвращают наборы запросов) для определения того, погиб ли элемент. В профиле пользователя существует метод, который возвращает что-то похожее на:

Item.live_objects.filter(seller=self.user), 

где non_perished_objects является одним из указанных пользовательских менеджеров.

Если, однако, элемент добавлен, он никогда не отражается с помощью этих методов userprofile. Только при перезапуске сервера (и при переполнении кэшей набора запросов) результаты будут правильными.

Есть ли способ заставить Django перезагрузить данные и удалить кэшированные данные?

Заранее спасибо!

Обновление:

class LiveItemsManager(models.Manager):

    kwargs = {'perished': False,
              'schedule__start_date__lte': datetime.datetime.now(),
              'schedule__end_date__gt': datetime.datetime.now()}

    def get_query_set(self):
        return super(LiveItemsManager, self).get_query_set().filter(**self.kwargs)

class Item(models.Model):
    live_objects = LiveItemsManager()
    perished = models.BooleanField(default=False)
    seller = models.ForeignKey(User)

Как видите, есть также модель Schedule, содержащая поле start_date, end_data и item_id.

В модели UserProfile у меня есть:

def _get_live_items(self):
    results = Item.live_objects.filter(seller=self.user)
    return results

live_items = property(_get_live_items)

Проблема в том, что при вызове свойства live_items возвращаемые результаты являются только кэшированными.

(PS: не обращайте внимания на настройку моделей; есть причина, по которой модели такие, какие они есть:))

1 Ответ

4 голосов
/ 20 декабря 2010

Проблема заключается в том, что kwargs оцениваются при первом определении Manager, то есть при первом импортировании models.py. Таким образом, значения, которые будут использоваться против schedule__start_date и schedule__end_date, рассчитываются тогда и не изменятся. Вы можете исправить это, переместив объявление kwargs внутри метода:

def get_query_set(self):
    kwargs = {'perished': False,
              'schedule__start_date__lte': datetime.datetime.now(),
              'schedule__end_date__gt': datetime.datetime.now()}
    return super(LiveItemsManager, self).get_query_set().filter(**kwargs)

(Помещение определения в __init__() не поможет, поскольку оно будет иметь тот же эффект: определение будет оцениваться при создании экземпляра менеджера, а не определения, но поскольку менеджер создается при определении модели , это почти то же самое время.)

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