如何不使用model_dump()从一个Pydantic模型实例化另一个模型
解决方案
可以通过创建包含external_data属性和额外字段的临时对象,结合model_validate(from_attributes=True)实现需求,完全避免调用model_dump()。
具体实现方式如下:
- 用
SimpleNamespace将external_data的属性与额外字段number合并为一个临时对象; - 调用
Internal.model_validate()传入该临时对象,同时设置from_attributes=True,让Pydantic从对象属性中提取字段值。
示例代码:
from pydantic import BaseModel from types import SimpleNamespace class External(BaseModel): string: str class Internal(BaseModel): string: str number: int external_data = External(string="Hello, World!") # 合并属性与额外字段到临时对象 temp_obj = SimpleNamespace(**external_data.__dict__, number=123) # 从临时对象创建Internal实例 internal_data = Internal.model_validate(temp_obj, from_attributes=True) print(internal_data) # 输出:string='Hello, World!' number=123
补充说明
from_attributes=True会让Pydantic优先从对象属性(而非字典键值)匹配字段,因此临时对象只需包含对应名称的属性即可;- 直接访问Pydantic模型的
__dict__是安全的,验证后的字段值会被存储在实例的__dict__中; - 若不想引入
SimpleNamespace,也可以手动定义简单类承载合并后的属性,效果一致。
内容的提问来源于stack exchange,提问作者Covey
相关产品推荐
相关产品推荐

