如何添加Django模型的两个字段并将总和保存在另一个字段中?

时间:2019-12-04 17:40:20

标签: django

class example(models.Model):
    var1 = models.IntegerField(default=0)
    var2 = models.IntegerField(default=0)
    var3 = models.IntegerField(default=0)

    sum = var1 + var2 + var3

有人可以帮助我保存三个字段的总和并将其保存在模型的总和字段中吗?

1 个答案:

答案 0 :(得分:0)

如果要将字段保存到数据库:

class example(models.Model):
    var1 = models.IntegerField(default=0)
    var2 = models.IntegerField(default=0)
    var3 = models.IntegerField(default=0)

    sum = models.IntegerField(...)

    def save(self):
        self.sum = self.var1 + self.var2 + self.var3
        return super(example, self).save()

,或者如果您只希望将其作为内存中的计算而不存储在数据库中(推荐):

class example(models.Model):
    var1 = models.IntegerField(default=0)
    var2 = models.IntegerField(default=0)
    var3 = models.IntegerField(default=0)

    @property
    def sum(self):
        sum = self.var1 + self.var2 + self.var3
        return sum

在属性中包装方法本质上使它成为可能,因此您不必使用括号来调用它。这实际上只是语法上的差异。建议这样做,因为您要避免冗余数据。想一想当您更新其中一个变量时会发生什么,但在更新总和之前发生错误?现在您的数据库处于无效状态,因为总和不能反映实际情况。因此最好在运行时进行计算。但是,如果计算量很大,您可能希望将其存储以节省性能。

示例,以a作为示例:

a = example()
a.var2 = 3
a.var1 = 2

如果sum是使用@property装饰器的方法:

print(a.sum) # outputs 5
print(a.sum()) # Never tried this but I think it would error?

如果sum只是没有@property装饰器的常规方法

print(a.sum()) # outputs 5
print(a.sum) # outputs a method pointer

注意::我从未真正尝试过这种方法来进行验证,但是我认为如果方法除了self之外还具有其他参数,则无法将它们包装在@property中。这真的没有任何意义,因为整个要点是它缩短了通话时间。