You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:50:58