如何对Django中的所有记录执行保存?

时间:2018-03-12 01:41:36

标签: django

在我的一个模型中,我想添加一个依赖于同一模型的其他字段的字段,并在保存记录时进行计算。

在我的数据库中已有记录,所以我认为我可以通过执行save来实现这一目标。我在一条记录上尝试了save,它似乎有效。

对于更多记录,我可以使用这样的循环:

for each_product_record in Product.objects.all():
    each_product_record.save()

有没有更好的方法,或者我手头有什么警告吗?

1 个答案:

答案 0 :(得分:1)

如果您只是需要计算字段的值而不查询它,您可以考虑在模型上添加propertymethod,以返回计算的字段值而不存储它在数据库中。

以下是一个例子:

class Order(models.Model):
    item = models.ForeignKey()
    quantity = models.IntegerField()
    price = models.DecimalField()

    @property
    def total_amount(self):
        return self.quantity * self.price

如果您确实需要查询该字段中的值,那么您将覆盖保存,如下所示:

class Order(models.Model):
    item = models.ForeignKey()
    quantity = models.IntegerField()
    price = models.DecimalField()
    total_amount = models.DecimalField()

    def save(self, *args, **kwargs):
        self.total_amount = self.quantity * self.price
        super(Order, self).save(*args, **kwargs)

添加字段后,循环每个记录并保存应更新所有值。如果您有大量事务,则forloop可能需要很长时间才能处理,因为每个循环执行单个数据库查询。为避免这种情况,您可以使用@transaction.atomic装饰器包含包含forloop的函数。使用此装饰器将确保在forloop结束后运行单个查询以更新所有记录。