django是否在模板中缓存了函数结果

时间:2013-01-16 03:46:10

标签: python django templates caching

我在models.py

class Team(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()

    a = models.IntegerField()
    b = models.IntegerField()

    def get_stat(self):
        return {
            'xy': self.x + self.y,
            'ab': self.a + self.b
        }

    stat = property(get_stat)

team.html我有:

xy stat: {{ team.stat.xy }}
ab stat: {{ team.stat.ab }}

问题是:“每当我调用get_stat或者缓存结果时,django会执行stat函数吗?”

2 个答案:

答案 0 :(得分:2)

不,property不会缓存任何结果。

如果您希望将其缓存以进行大量重复访问,则典型的设计模式为:

def get_stat(self):
    if not hasattr(self, '__get_stat'):
         self.__get_stat =  {
            'xy': self.x + self.y,
            'ab': self.a + self.b
         }
    return self.__get_stat

当然,如果做的事情很奇怪,比如处理那些在适当位置修改但未提交给数据库的实例,则无法正常工作。我相信99%的用途涉及 DB-> Object-> Action

答案 1 :(得分:1)

这不是一个具体的答案,因为你已经知道它没有被缓存,而是一些一般的建议。通常,确定这样的东西是否被缓存(或者调用一些随机代码)的方法是在那里添加一些日志记录或调试语句。

def get_stat(self):
    # logging or debugging statement here, e.g. import ipdb; ipdb.set_trace()
    # for ipdb, you need to pip install ipdb
    return {
        'xy': self.x + self.y,
        'ab': self.a + self.b
    }

您也可以在django自己的代码中使用它来查看在您的页面投放时所采用的执行路径。