如何在django中缓存模型方法?

时间:2015-12-09 21:28:54

标签: django django-cache

我有这个型号:

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绕过视图并直接在模板中调用。所以,请欣赏有关如何缓存它的提示。

2 个答案:

答案 0 :(得分:3)

我想您可以使用https://pypi.python.org/pypi/cached-property/1.2.0

中的cached_property_with_ttl
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]

希望这对你有用。

答案 1 :(得分:0)

正如@Thomas Druez所说,Django现在具有内置的cached_property

from django.utils.functional import cached_property

class Article(models.Model):

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

但是,我不知道您是否可以设置5分钟的到期时间。同一页上显示“只要实例执行,缓存结果就将持续存在。”