关于Pydantic中model_validators执行顺序的技术问询
Pydantic中model_validators的执行顺序详解
嘿,这个问题问到点子上了!我之前在项目里也遇到过类似的困惑,特意研究了Pydantic的验证逻辑,尤其是继承场景下的model_validators执行顺序,下面给你详细梳理清楚:
一、基础场景(非继承模型)的执行顺序
在同一个模型中定义多个model_validators时,执行顺序由两个核心因素决定:
- 验证器的
mode参数优先级:mode='before'会先于所有字段级验证执行,mode='after'则在字段验证完成后运行,mode='wrap'会包裹整个验证流程(日常开发中用得较少)。 - 同mode下的定义顺序:相同
mode的验证器,严格按照你代码里的定义先后顺序依次执行。
举个简单的代码例子:
from pydantic import BaseModel, model_validator class User(BaseModel): name: str age: int @model_validator(mode='before') def first_before_validator(cls, values): print("第一个before验证器执行") return values @model_validator(mode='before') def second_before_validator(cls, values): print("第二个before验证器执行") return values @model_validator(mode='after') def after_field_validator(self): print("after验证器执行") return self
实例化时的输出顺序会是:
第一个before验证器执行 第二个before验证器执行 after验证器执行
二、继承场景下的执行顺序
当父类和子类都定义了model_validators时,执行顺序严格遵循继承链从父到子的规则,同时结合mode参数的阶段划分:
mode='before'阶段:先执行父类的所有before验证器(按父类内的定义顺序),再执行子类的所有before验证器。- 字段验证阶段:先验证父类的字段,再验证子类新增的字段(字段自身的验证顺序按模型中字段定义的先后)。
mode='after'阶段:同样先执行父类的after验证器,再执行子类的after验证器。
用代码验证这个逻辑:
from pydantic import BaseModel, model_validator class Parent(BaseModel): name: str @model_validator(mode='before') def parent_before(cls, values): print("父类before验证器执行") return values @model_validator(mode='after') def parent_after(self): print("父类after验证器执行") return self class Child(Parent): age: int @model_validator(mode='before') def child_before(cls, values): print("子类before验证器执行") return values @model_validator(mode='after') def child_after(self): print("子类after验证器执行") return self # 实例化测试 Child(name="Alice", age=30)
输出顺序会是:
父类before验证器执行 子类before验证器执行 父类after验证器执行 子类after验证器执行
三、顺序是否有官方保证?
这个顺序是Pydantic官方明确承诺的稳定行为,绝非可随意变更的实现细节。Pydantic的验证系统设计完全遵循面向对象的继承逻辑,确保父类的验证逻辑先于子类执行,这样子类可以基于父类验证后的结果做进一步处理,符合代码直觉和继承的设计原则。
内容来源于stack exchange
相关产品推荐
相关产品推荐

