如何在模型上定义“Save”方法后避免重复保存?
如何在模型上定义“Save”方法后避免重复保存?
我在我的模型中为订单字段定义了一个Save方法。
现在,当我在视图中对订单字段进行一些操作并调用save()时,我会保存两次 - 在视图中的save()和模型中的save()。
因此,出现了问题!如何解决这个问题?如何使Save方法只在创建模型对象时起作用?并且在视图中调用save()时不起作用。
def save(self, *args, **kwargs): model_class = type(self) last_item = model_class.objects.order_by('-order').first() if last_item is not None: self.order = last_item.order += 1 super().save(*args, **kwargs)
如何在定义了模型的`Save`方法后避免重复保存?
问题原因:
根据问题描述,需要在保存方法中的额外代码仅在创建对象时运行,而不是在更新模型实例时运行。在对象在数据库中创建之前,它的主键(PK)是None。可以利用这一点来检查是创建操作还是更新操作。
解决方法:
一种解决方法是使用以下代码:
def save(self, *args, **kwargs): if self.pk is None: # this code will only be executed when the object is created model_class = type(self) last_item = model_class.objects.order_by('-order').first() if last_item is not None: self.order = last_item.order + 1 else: self.order = 0 super().save(*args, **kwargs)
另一种选择是使用`Model._state`。相关问题可以参考stackoverflow.com上的链接:stackoverflow.com/questions/907695/...
这些解决方法可以确保在定义了模型的`Save`方法后避免重复保存。