我想使用 pydantic
来处理 api 和数据存储之间的数据(双向),因为它很好地支持我关心的几种类型,这些类型不是本机 json 可序列化的。它具有比当前方法更好的读取/验证支持,但我还需要创建 json-serializable dict
对象来写出。
from uuid import UUID, uuid4
from pydantic import BaseModel
class Model(BaseModel):
the_id: UUID
instance = Model(the_id=uuid4())
print("1: %s" % instance.dict()
print("2: %s" % instance.json()
印刷
{'the_id': UUID('4108356a-556e-484b-9447-07b56a664763')}
>>> inst.json()
'{"the_id": "4108356a-556e-484b-9447-07b56a664763"}'
我喜欢以下内容:
{"the_id": "4108356a-556e-484b-9447-07b56a664763"} # eg "json-compatible" dict
看来虽然 pydantic 具有所有映射,但我找不到标准之外的序列化的任何用法 json
~递归编码器( json.dumps( ... default=pydantic_encoder)
)在 pydantic/main.py
。但我更愿意为 validate raw->obj(pydantic 在这方面做得很好)和 obj->raw(dict) 保留一个库,这样我就不必管理多个序列化映射。我想我可以实现类似于 json
编码器用法的东西,但这应该是一个常见的用例?
其他方法,例如 dataclasses(builtin)
+ 库,例如 dataclasses_jsonschema
提供这个〜序列化到 json-ready dict
,同时希望保持更强大的 pydantic 输入验证,但再次使用东西对称。
原文由 some bits flipped 发布,翻译遵循 CC BY-SA 4.0 许可协议
似乎这个功能已经被提出,并且(可能)受到 pydantic 的作者 samuel colvin 的青睐,如 https://github.com/samuelcolvin/pydantic/issues/951#issuecomment-552463606
其中建议将
simplify
参数添加到Model.dict()
以输出 jsonalbe 数据。此代码在生产 api 层中运行,并且已被执行,因此我们无法使用建议的单行解决方法(只需执行完整序列化 (
.json()
) + 完整反序列化)。我们实现了一个自定义函数来执行此操作,对.dict()
的结果进行降序处理,并将类型转换为 jsonable - 希望上述提议的功能将来会添加到 pydantic 中。