Marshmallow Dataclass v3.x:Load与Dump使用不同键的问题排查
问题分析与解决方案
核心问题
你需要实现加载时接收非Python合法键名(如external.id),转储时输出符合驼峰命名的键名(如externalId),但错误使用了data_key(该参数会统一设置加载和转储的键名),额外添加的attribute参数属于冗余配置,反而导致逻辑混乱。
正确实现方式
Marshmallow 3.x仍支持通过load_from和dump_to分别指定加载、转储的键名,marshmallow-dataclasses会将字段metadata中的这两个参数传递给底层的Marshmallow字段。
推荐写法(遵循Python命名规范)
import marshmallow_dataclass from dataclasses import field @marshmallow_dataclass.dataclass class Uao: # 使用PEP8规范的下划线命名属性 external_id: str = field( metadata={ "load_from": "external.id", # 加载时接收的键名 "dump_to": "externalId" # 转储时输出的键名 } ) schema = marshmallow_dataclass.class_schema(Uao) uao_loaded = schema().load({"external.id": "1234"}) uao_dumped = schema().dump(uao_loaded) print(uao_dumped) # 输出: {'externalId': '1234'}
若坚持使用驼峰属性名
import marshmallow_dataclass from dataclasses import field @marshmallow_dataclass.dataclass class Uao: externalId: str = field( metadata={ "load_from": "external.id", "dump_to": "externalId" } ) schema = marshmallow_dataclass.class_schema(Uao) uao_loaded = schema().load({"external.id": "1234"}) uao_dumped = schema().dump(uao_loaded) print(uao_dumped) # 输出: {'externalId': '1234'}
错误点说明
data_key的误用:该参数会同时设置加载和转储的键名,无法实现两者不同的需求,需替换为load_from+dump_to组合。- 冗余的
attribute参数:该参数用于将字段映射到对象的其他属性名,但你的字段名已经是目标属性名,添加后会导致映射逻辑混乱。 external_id属性的错误:之前抛出TypeError是因为未配置load_from,导致schema加载时无法将external.id映射到external_id属性,配置load_from后即可解决。
内容的提问来源于stack exchange,提问作者nikitira
相关产品推荐
相关产品推荐

