如何检查是否引发了 Django ValidationError 子类?

How to check if Django ValidationError subclass was raised?

假设我有一个 Django 模型:

class MyDjangoModel(models.Model):
    name = models.CharField(max_length=200)
    attribute = models.IntegerField()

    class CustomValidationError(ValidationError):
        pass

    def clean(self):
        if self.attribute < 1:
            raise CustomValidationError("Attribute should be > 1!")

        if len(self.name) > 20:
            raise ValidationError("Name too long!")

我想创建模型实例并验证它:

inst = MyDjangoModel(name="Foo", attribute=0)
try:
    inst.full_clean()
except CustomValidationError:
    print("Hello!")
except ValidationError:
    print("Bye!")

但是上面的代码永远不会打印 "Hello!" 因为 full_clean 方法只引发 ValidationError.

谁能建议,如何调用 full_clean 并检查是否引发了 ValidationError 子类异常?

full_clean 方法收集了几个阶段出现的所有错误。

您可以在此处查看它如何调用您的 clean 方法:https://github.com/django/django/blob/master/django/db/models/base.py#L1150

幸运的是,原始的异常被保存在 error_dict.

你可以试试这个:

inst = MyDjangoModel(name="Foo", attribute=0)
try:
    inst.full_clean()
except ValidationError as exc:
    for original_exc in exc.error_dict['__all__']:
        if isinstance(original_exc, MyDjangoModel.CustomValidationError):
            print("Hello!")
        elif isinstance(original_exc, ValidationError):
            print("Bye!")

假设 CustomValidationError 仅从 clean 方法引发。否则你还需要检查 error_dict.

中的其他键

请注意 if 的顺序很重要:如果第一个为真,则第二个也为真。