Python 添加新模型实例时,如何在clean()中为M2M运行自定义模型验证

Python 添加新模型实例时,如何在clean()中为M2M运行自定义模型验证,python,django,django-models,django-forms,django-admin,Python,Django,Django Models,Django Forms,Django Admin,我在Django有一个模型,与另一个模型有ManyToManyField关系。看起来像这样的东西: class MyModel(models.Model): id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4) models = models.ManyToManyField( OtherModel, related_name='my_models',

我在Django有一个模型,与另一个模型有
ManyToManyField
关系。看起来像这样的东西:

class MyModel(models.Model):
    id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    models = models.ManyToManyField(
        OtherModel,
        related_name='my_models',
        )
在我的
clean()
方法中,我有一组在模型字段中运行的自定义验证规则。他们中的一些人实际上是在很多地方跑步。当使用上传工具创建模型实例时,所有验证都可以正常工作,上传工具可以将csv中的数据解析为模型实例,或者将现有模型保存在管理中

但是,我希望能够直接在管理中添加模型实例,但由于多对多关系,我发现在使用
save()
方法之前,多对多关系是没有设置的,因此一些验证会抛出一个
ValueError:“需要为字段“id”设置一个值才能使用此多对多关系。
([ref][1])

然后,我对
clean()
方法中的验证进行了一次非常丑陋的攻击,通过捕获
ValueError
绕过验证:

def _some_validation(self):
    try:
        if self.my_models.count() == 0:
            raise ValidationError("This is an error message thrown by ...")
    except ValueError as e:
        print(e)
然后通过Admin添加一个模型实例就可以了,但是,它不会在ManyToMany字段上运行验证,从而允许不一致的数据

在通过管理中的
add_form
创建新模型实例时,设置M2M关系后,是否有方法可以重新运行
clean()
方法

注意:我没有使用自定义表单,因为我发现没有必要,因为管理员中Django默认生成的add表单满足了我的需要。
[1] :

您可以尝试收听m2m\u已更改的信号

def my_models_changed(sender, **kwargs):
    # Do something
    pass

m2m_changed.connect(my_models_changed, sender=MyModel.my_models.through)


谢谢你的回答。我可能错了,但m2m_更改信号是否会引发验证错误?