我有这个型号:
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
绕过视图并直接在模板中调用。所以,请欣赏有关如何缓存它的提示。
答案 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分钟的到期时间。同一页上显示“只要实例执行,缓存结果就将持续存在。”