我正在使用一些必须返回模型字段总和的模型。是否更好地覆盖模型上的save方法或仅创建返回总和的自定义方法。两种解决方案都存在任何性能问题吗?
选项1:覆盖保存方法。
class SomeModel(models.Model):
integer1 = models.IntegerField()
integer2 = models.IntegerField()
integer3 = models.IntegerField()
sum_integers = models.IntegerField()
def save(self, *args, **kwargs):
self.sum_integers = sum(
[self.integer1, self.integer2, self.integer3])
self.sum_integers.save()
return super(SomeModel, self).save(*args, **kwargs)
选项2:自定义方法
class SomeModel(models.Model):
integer1 = models.IntegerField()
integer2 = models.IntegerField()
integer3 = models.IntegerField()
@property
def sum_integers(self):
return sum([self.integer1, self.integer2, self.integer3])
答案 0 :(得分:2)
答案取决于你使用sum_integers的方式。如果你把它作为一个字段保存在数据库中,你就可以对它进行查询,而对于属性来说它会非常棘手。
另一方面,如果你不打算进行查询,这些数据对你没有价值(换句话说 - 你需要sum_integers作为数据表示) 那么你应该选择财产。
从应用程序性能的角度来看: 如果要对数千个对象进行复杂操作 - 最好将值存储在列中,或者至少将属性更改为cached_property(如果它被调用几次)。
总结一下 - 数据库列中sum的存储值更为通用,并且没有任何降级,但在某些情况下,property
方法可以让您的数据模型更加清晰并节省一些空间你的磁盘。
我希望这是你问题的答案。如果不清楚,请填写免费提问。
答案 1 :(得分:2)
取决于您是否需要更新字段或更多地调用总和。
我假设,为了使它更通用,操作不仅是加法,而是涉及大数的多个复杂计算。
如果必须时不时地得到总和,那么最好创建一个模型字段并在保存时添加值。
如果你必须更新它,那么通常在通话中获取值(第二种方法)更合适。