class example(models.Model):
var1 = models.IntegerField(default=0)
var2 = models.IntegerField(default=0)
var3 = models.IntegerField(default=0)
sum = var1 + var2 + var3
有人可以帮助我保存三个字段的总和并将其保存在模型的总和字段中吗?
答案 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中。这真的没有任何意义,因为整个要点是它缩短了通话时间。