带Extra.Allow参数的Pydantic Dataclass转Dict失败求助
解决Pydantic Dataclass(开启Extra.allow)转字典的问题
问题原因
你通过MyDataModel.__pydantic_model__.parse_obj(data)得到的是Pydantic BaseModel实例,而非Pydantic dataclass实例,Python标准库的dataclasses.asdict()仅支持原生dataclass或Pydantic dataclass实例,因此触发报错。
无额外参数时能正常运行,是因为你直接用MyDataModel(**data)创建了dataclass实例,而非通过底层BaseModel解析。
解决方案
方案1:直接调用BaseModel的dict()方法
既然已经得到BaseModel实例,直接使用它自带的dict()方法即可获取包含所有字段(包括额外字段bar)的字典:
dc_as_dict = dc.dict() # 输出结果: {'foo': 1, 'bar': 2}
方案2:创建Pydantic dataclass实例后用专属方法转换
如果要保持使用dataclass实例,直接通过类初始化创建,再用Pydantic提供的pydantic.dataclasses.asdict()方法(而非标准库的dataclasses.asdict())转换,该方法能识别并包含存在__pydantic_extra__中的额外字段:
# 直接创建Pydantic dataclass实例 dc = MyDataModel(**data) # 使用Pydantic专属的asdict方法转换 dc_as_dict = pydantic.dataclasses.asdict(dc) # 输出结果: {'foo': 1, 'bar': 2}
方案3:从BaseModel实例转成dataclass实例再转换
如果必须基于已有的BaseModel实例处理,可先将其转为dataclass实例,再用Pydantic的asdict方法转换:
# 从BaseModel实例转成dataclass实例 dc_dataclass = MyDataModel(**dc.dict()) # 转换为字典 dc_as_dict = pydantic.dataclasses.asdict(dc_dataclass)
内容的提问来源于stack exchange,提问作者Uwe Brandt
相关产品推荐
相关产品推荐

