1

我有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 }}

问题是:“djangoget_stat每次我调用时都会执行函数stat还是缓存结果?”

4

2 回答 2

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

于 2013-01-16T04:05:10.470 回答
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 自己的代码中使用它来查看提供页面时所采用的执行路径。

于 2013-01-16T09:08:57.923 回答