django何时计算未存储在数据库中的属性

时间:2018-09-27 13:34:50

标签: django django-models django-views

有关性能的快速问题。假设我们有一些模型:

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

我的问题是,创建具有该属性的对象时,何时计算该属性/属性?是仅在视图或模板中调用它时才计算它,还是在检索到该对象时或在创建该类的实例时才计算它?我想如果经常进行计算而不在视图或模板中使用它,则会降低性能。

谢谢

1 个答案:

答案 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)

但是请注意,如果更改了方法所依赖的属性和参数,则缓存将不会自动失效。

如果您不需要此缓存版本,则不会计算该值。