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
相关产品推荐
相关产品推荐

