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

50pmv0ei  于 2023-05-19  发布在  Go
关注(0)|答案(2)|浏览(130)

假设我有一个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子类异常?

wr98u20j

wr98u20j1#

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 s的顺序很重要:如果第一个为真,则第二个也为真。

k3bvogb1

k3bvogb12#

使用except Exception as e:时的另一种方法:

try:
   ...
except Exception as e:
   if isinstance(e, ValidationError):
       print("Validation error occured")

注:这是一个通用的答案,当一个特定类型的错误被提出时做一些事情

相关问题