2015-12-09 2 views
2

У меня есть эта модель:Как кэшировать метод модели в django?

class Article(models.Model): 
    title = models.CharField(max_length=300, blank=False) 
    body = models.TextField(max_length=10000, blank=False) 
    created = models.DateTimeField(auto_now_add=True) 


    def last_post(self): 
     if self.post_set.count(): 
      return self.post_set.order_by("-created")[0] 

Я заметил, что last_post создает очень дорогостоящий и часто запускаемый запрос. Поэтому я хочу кэшировать его в течение 5 минут.

Я знаю, как кэшировать запрос в представлениях, но last_post обходит представления и напрямую вызывается в шаблоне. Поэтому оцените ваши советы о том, как их кешировать.

+1

Возможно, 'cached_property' - это то, что вам нужно. Посмотрите: http://www.pydanny.com/cached-property.html – Ingaz

+0

Звучит неплохо. Можете ли вы рассказать об этом в качестве полного ответа? – Jand

+0

'@ cached_property' кэширует результат для всего запроса, а не 5 минут. Возможно, это работает для вас. –

ответ

3

Я полагаю, что вы можете использовать cached_property_with_ttl из https://pypi.python.org/pypi/cached-property/1.2.0

from cached_property import cached_property_with_ttl 

class Article(models.Model): 
    title = models.CharField(max_length=300, blank=False) 
    body = models.TextField(max_length=10000, blank=False) 
    created = models.DateTimeField(auto_now_add=True) 

    @cached_property_with_ttl(ttl=5) 
    def last_post(self): 
     if self.post_set.count(): 
      return self.post_set.order_by("-created")[0] 

Надеется, что это будет работать для вас.

+0

Отлично! Единственная проблема в том, что я использую 1.8. который не имеет 'cached_property_with_ttl'. Есть ли обходной путь для этого? – Jand

+0

Это не реализация django. Это отдельный пакет. – Ingaz

+0

Ну, я получаю эту ошибку 'from cached_property import cached_property_with_ttl ImportError: Нет модуля с именем cached_property'. Итак, как мне установить/импортировать его в 1.8? – Jand

Смежные вопросы