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

关于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参数的阶段划分:

  1. mode='before'阶段:先执行父类的所有before验证器(按父类内的定义顺序),再执行子类的所有before验证器。
  2. 字段验证阶段:先验证父类的字段,再验证子类新增的字段(字段自身的验证顺序按模型中字段定义的先后)。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:29:31