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

