Pydantic 2:实例生成后修改字段别名的方法问询
解决Pydantic实例创建后修改字段别名的问题
直接修改实例的model_fields里的别名不会生效,因为model_fields是类级别的属性,修改它会影响所有该类的实例,且Pydantic在序列化时依赖预编译的别名映射,临时修改无法触发更新。这里提供两种不需要修改原模型类的解决方案:
方案一:动态创建子类修改字段别名
通过动态生成原模型的子类,在子类中修改目标字段的别名,再将现有实例转换为子类实例,这样既保留原类不变,又能实现自定义别名的序列化:
from pydantic import BaseModel class MyModel(BaseModel): name: str age: int obj = MyModel(age=8, name='Brian') # 基于原模型创建动态子类,修改name字段的alias ModifiedModel = type( 'ModifiedModel', (MyModel,), {'name': MyModel.model_fields['name'].model_copy(update={'alias': 'full_name'})} ) # 将原实例转换为子类实例 modified_obj = ModifiedModel.model_validate(obj.model_dump()) print(modified_obj.model_dump(by_alias=True))
输出结果:
{'full_name': 'Brian', 'age': 8}
方案二:手动替换序列化结果的键
如果只是需要最终输出的键名变更,最直接的方式是在序列化后手动替换键:
obj = MyModel(age=8, name='Brian') raw_dump = obj.model_dump() # 替换键名 raw_dump['full_name'] = raw_dump.pop('name') print(raw_dump)
输出结果:
{'age': 8, 'full_name': 'Brian'}
内容的提问来源于stack exchange,提问作者Tom Hamilton Stubber
相关产品推荐
相关产品推荐

