如何在模型上定义“Save”方法后避免重复保存?

16 浏览
0 Comments

如何在模型上定义“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)

0
0 Comments

如何在定义了模型的`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`方法后避免重复保存。

0