如何检测 ModelForm.clean 中是否添加或编辑了 obj?

How to detect if obj is being added or edited inside ModelForm.clean?

我想以不同方式验证用户提交的数据,无论用户是添加新对象还是更改现有对象。如果对象已经存在(如果它存在于数据库中,则正在添加),除了我可以在数据库上检查的 id 之外,没有模型的属性。 在其他方法中,如save_model,传递了一个add参数,所以你可以检查它,但在modelform.clean中没有这个参数。如何在 modelform.clean?

中进行验证
MyModelForm(forms.ModelForm):
    def clean(self):
        if add :
            validation_A()
        else:
            validantion_B()

在数据库级别不存在的对象有一个 id(也许最好使用 pk),即 None(因为 id 是根据数据库中的插入确定的,Django 不会分配该 id)。

所以我们可以检查 self.instance.pk is None:

MyModelForm(forms.ModelForm):

    def clean(self):
        if <b>self.instance.pk is None</b>:  # add
            validation_A()
        else:                         # edit
            validantion_B()

当然上面的方法可以是"spoofed",也就是说在你创建对象之前,你可以把id设置成None,但是Model.save(..) 对象也使用这个事实来决定是执行 INSERT INTO 还是 UPDATE.