Django模型,使用属性覆盖save方法或自定义方法

时间:2016-09-06 17:15:22

标签: python django django-models

我正在使用一些必须返回模型字段总和的模型。是否更好地覆盖模型上的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])

2 个答案:

答案 0 :(得分:2)

答案取决于你使用sum_integers的方式。如果你把它作为一个字段保存在数据库中,你就可以对它进行查询,而对于属性来说它会非常棘手。

另一方面,如果你不打算进行查询,这些数据对你没有价值(换句话说 - 你需要sum_integers作为数据表示) 那么你应该选择财产。

从应用程序性能的角度来看: 如果要对数千个对象进行复杂操作 - 最好将值存储在列中,或者至少将属性更改为cached_property(如果它被调用几次)。

总结一下 - 数据库列中sum的存储值更为通用,并且没有任何降级,但在某些情况下,property方法可以让您的数据模型更加清晰并节省一些空间你的磁盘。

我希望这是你问题的答案。如果不清楚,请填写免费提问。

答案 1 :(得分:2)

取决于您是否需要更新字段或更多地调用总和。

我假设,为了使它更通用,操作不仅是加法,而是涉及大数的多个复杂计算。

如果必须时不时地得到总和,那么最好创建一个模型字段并在保存时添加值。

如果你必须更新它,那么通常在通话中获取值(第二种方法)更合适。