在我的一个模型中,我想添加一个依赖于同一模型的其他字段的字段,并在保存记录时进行计算。
在我的数据库中已有记录,所以我认为我可以通过执行save
来实现这一目标。我在一条记录上尝试了save
,它似乎有效。
对于更多记录,我可以使用这样的循环:
for each_product_record in Product.objects.all():
each_product_record.save()
有没有更好的方法,或者我手头有什么警告吗?
答案 0 :(得分:1)
如果您只是需要计算字段的值而不查询它,您可以考虑在模型上添加property
或method
,以返回计算的字段值而不存储它在数据库中。
以下是一个例子:
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结束后运行单个查询以更新所有记录。