class example(models.Model):
var1 = models.IntegerField(default=0)
var2 = models.IntegerField(default=0)
var3 = models.IntegerField(default=0)
sum = var1 + var2 + var3
谁能帮我保存三个字段的总和并将其保存在模型的总和字段中?
如果要将字段保存到数据库:
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中。这真的没有意义,因为重点是它缩短了通话时间。