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

Pydantic中多after模式模型验证器仅抛出一个ValidationError

关于Pydantic多个after模式模型验证器的错误抛出问题

核心结论

Pydantic 支持多个@model_validator(mode="after")验证器,但默认行为是短路执行:只要某个验证器抛出异常,后续验证器就会停止执行,因此只会返回第一个触发的错误。

原因说明

mode="after"的模型验证器会按照代码中定义的顺序依次执行。一旦某个验证器抛出ValueError或其他验证异常,Pydantic会立即终止整个验证流程,不会继续运行后续的验证逻辑,这是框架默认的设计逻辑。

解决方案:收集所有验证错误

如果需要一次性返回所有验证失败的信息,你可以将多个检查逻辑整合到单个after模式验证器中,手动收集所有错误后统一抛出ValidationError:

from pydantic import BaseModel, model_validator, ValidationError
from typing import List

class Foo(BaseModel):
    x: int
    y: str
    z: float

    @model_validator(mode="after")
    def validate_all_rules(self):
        errors: List[dict] = []
        
        # 检查x和y的规则
        if self.x == 1 and self.y == "2":
            errors.append({
                "type": "value_error",
                "loc": ("__root__",),
                "msg": "x and y"
            })
        
        # 检查y和z的规则
        if self.y == "2" and int(self.z) == 3:
            errors.append({
                "type": "value_error",
                "loc": ("__root__",),
                "msg": "y and z"
            })
        
        # 如果有错误,统一抛出
        if errors:
            raise ValidationError.from_exception_data(
                title=self.__class__.__name__,
                line_errors=errors
            )
        
        return self

# 现在会返回两个验证错误
Foo(x=1, y="2", z=3.0)

执行上述代码后,会得到包含两个错误的ValidationError,符合你预期的结果。

替代思路

如果你坚持要使用多个独立的验证器,需要避免在单个验证器中直接抛出异常,而是通过类实例属性临时收集错误,最后在一个收尾的验证器中统一抛出。不过这种方式不如单验证器整合逻辑直观,维护成本也更高,因此更推荐前者。

内容的提问来源于stack exchange,提问作者LondonRob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:05:07