我想使用
pydantic
来处理 api 和数据存储之间的数据(双向),因为它可以很好地支持我关心的几种本身不能 json 序列化的类型。它比当前方法具有更好的读取/验证支持,但我还需要创建 json 可序列化 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)
)之外找不到序列化的任何用法。但我更愿意保留一个库来验证 raw->obj (pydantic 很擅长这一点)以及 obj->raw(dict),这样我就不必管理多个序列化映射。我想我可以实现类似于编码器 pydantic/main.py
用法的东西,但这应该是一个常见的用例?其他方法(例如 json
+ 库(例如
dataclasses(builtin)
)提供此〜序列化到 dataclasses_jsonschema
,但同样,希望使用 pydantic 进行更强大的输入验证,同时保持对称。json-ready dict
不支持直接创建jsonable
pydantic
。但你可以使用以下技巧:注意:这是一个次优解决方案
dict
class Model(BaseModel):
the_id: UUID = Field(default_factory=uuid4)
print(json.loads(Model().json()))
或者通过orjson
更有效
{'the_id': '4c94e7bc-78fe-48ea-8c3b-83c180437774'}
皮丹提克 2
方法接受
model_dump()
参数。mode
mode:`to_python` 应该运行的模式。如果模式为“json”,则字典将仅包含 JSON 可序列化类型。
如果模式为“python”,则字典可能包含任何Python对象。
mode: Literal['json', 'python'] | str = 'python'
class Model(BaseModel):
the_id: UUID = Field(default_factory=uuid4)
print(Model().model_dump(mode='json'))
添加
simplify
参数以输出 jsonalbe 数据。此代码在生产 api 层中运行,并且经过了锻炼,因此我们无法使用建议的单行解决方法(只需执行完整序列化 (Model.dict()
) + 完整反序列化)。我们实现了一个自定义函数来执行此操作,对
.json()
的结果进行降序并将类型转换为 jsonable - 希望上述建议的功能将来添加到 pydantic 中。fastapi
参数的
.model_dump()
方法:mode="json"
来自
print(instance.model_dump(mode="json"))
文档:
Pydantic 2 Plan