我在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
函数吗?”
答案 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自己的代码中使用它来查看在您的页面投放时所采用的执行路径。