有关性能的快速问题。假设我们有一些模型:
class MyModel(models.Model):
number = models.IntegerField(default=0)
def getComplicatedNumber(self):
# do some complex calculations here, including other db calls
return 0 # really return the complex calculation
otherNum = property(getComplicatedNumber)
那么,我们说一个视图:
modelObject.otherNum
或在模板中
{{ modelObject.otherNum }}
我的问题是,创建具有该属性的对象时,何时计算该属性/属性?是仅在视图或模板中调用它时才计算它,还是在检索到该对象时或在创建该类的实例时才计算它?我想如果经常进行计算而不在视图或模板中使用它,则会降低性能。
谢谢
答案 0 :(得分:2)
我的问题是,创建具有该属性的对象时,何时计算该属性/属性?是仅在视图或模板中调用它时才计算它,还是在检索到该对象时或创建该类的实例时才计算它?
它是您每次提取每次计算的。因此,如果您写:
modelObject.otherNum # call getComplicatedNumber() the first time
modelObject.otherNum # call getComplicatedNumber() the second time
getComplicatedNumber
被称为两次。
它不是 预先计算的(因此,如果您永远不需要该属性,则永远不会计算它),也不会 cached (一旦计算,该值为没有存储,以防止再次计算。
您当然可以实现以下缓存:
# possible implementation of a cache
class MyModel(models.Model):
number = models.IntegerField(default=0)
def getComplicatedNumber(self):
if not hasattr(self, '_complicated'):
# do some complex calculations here, including other db calls
self._complicated = 0 # really return the complex calculation
return self._complicated
otherNum = property(getComplicatedNumber)
但是请注意,如果更改了方法所依赖的属性和参数,则缓存将不会自动失效。
如果您不需要此缓存版本,则不会计算该值。