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

Pydantic V1与V2中Dict字段接收模型的行为差异及兼容方案咨询

Pydantic V2 保留模型实例自动转为dict的方法

Pydantic V2 收紧了类型校验逻辑,所以直接把模型实例传给dict类型字段会触发校验错误,但有两种方式可以恢复自动转换的行为:

  • 给字段添加前置验证器,自动转换模型为字典
    写一个简单的转换函数,通过BeforeValidator绑定到目标字段上,就能在校验阶段自动把模型实例转成字典:

    from pydantic import BaseModel, BeforeValidator
    from typing import Any
    
    def model_to_dict(v: Any) -> Any:
        if isinstance(v, BaseModel):
            return v.model_dump()
        return v
    
    class Test(BaseModel):
        x: dict = BeforeValidator(model_to_dict)
    
    class X(BaseModel):
        name: str
    
    x = X(name="name")
    test = Test(x=x)  # 正常运行,x会被自动转为{"name": "name"}
    
  • 用联合类型配合序列化器
    先允许字段接收dict或模型实例,再通过序列化器统一将输入转为字典格式:

    from pydantic import BaseModel, PlainSerializer
    from typing import Union
    
    def serialize_model(v: Union[dict, BaseModel]) -> dict:
        return v.model_dump() if isinstance(v, BaseModel) else v
    
    class Test(BaseModel):
        x: Union[dict, BaseModel] = PlainSerializer(serialize_model, return_type=dict)
    
    class X(BaseModel):
        name: str
    
    x = X(name="name")
    test = Test(x=x)
    assert test.x == {"name": "name"}
    

如果不想写额外的转换逻辑,手动调用model_dump()(Pydantic V2替代V1中dict()的方法)把模型转成字典再传入,也是完全可行的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:07:00