如何在Pydantic V2的model_validator中实现skip_on_failure功能?
Pydantic V2 实现 root_validator 的 skip_on_failure 功能
在Pydantic V2里,model_validator默认是只要有一个验证失败就停掉后续验证,不过可以通过两种方式模拟V1中root_validator(skip_on_failure=True)的效果——也就是前面的验证器失败后,剩下的验证器依然能运行:
多个独立的
mode='after'验证器:
给每个需要单独运行的验证逻辑都加一个@model_validator(mode='after')装饰器,每个验证器自己抛出对应错误。这样哪怕前一个验证失败,后一个还是会执行,最终所有错误都会被收集。示例代码:from pydantic import BaseModel, ValidationError, model_validator class User(BaseModel): username: str age: int @model_validator(mode='after') def check_username_length(self) -> 'User': if len(self.username) < 4: raise ValueError('用户名长度至少为4位') return self @model_validator(mode='after') def check_age_valid(self) -> 'User': if self.age < 16 or self.age > 80: raise ValueError('年龄必须在16到80之间') return self try: User(username='Tom', age=15) except ValidationError as e: print(e.errors())运行后会同时输出用户名和年龄的两个错误,达到了
skip_on_failure=True的效果。单验证器内批量收集错误:
如果想更集中管理验证逻辑,可以在一个model_validator里把所有验证都做了,把所有错误收集起来再一起抛出。示例:from pydantic import BaseModel, ValidationError, model_validator from typing import List class User(BaseModel): username: str age: int @model_validator(mode='after') def validate_all_rules(self) -> 'User': errors: List[dict] = [] if len(self.username) < 4: errors.append({'loc': ('username',), 'msg': '用户名长度至少为4位', 'type': 'value_error'}) if self.age < 16 or self.age > 80: errors.append({'loc': ('age',), 'msg': '年龄必须在16到80之间', 'type': 'value_error'}) if errors: raise ValidationError.from_exception_data(title='User', errors=errors) return self try: User(username='Tom', age=15) except ValidationError as e: print(e.errors())
要注意的是,Pydantic V2的model_validator没有直接提供skip_on_failure参数,只能通过上面的方法实现相同的功能。
内容的提问来源于stack exchange,提问作者Minura Punchihewa
相关产品推荐
相关产品推荐

