[英]Pydantic Model: Convert UUID to string when calling .dict()
[英]pydantic convert to jsonable dict (not full json string)
我想使用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 具有所有映射,但我在pydantic/main.py
中找不到標准json
~遞歸編碼器( json.dumps(... default=pydantic_encoder)
)之外的任何序列化用法。 但我更願意為 validate raw->obj (pydantic 擅長於此)和 obj->raw(dict) 保留一個庫,這樣我就不必管理多個序列化映射。 我想我可以實現類似於編碼器的json
用法的東西,但這應該是一個常見的用例嗎?
其他方法,如dataclasses(builtin)
+ 庫,如dataclasses_jsonschema
為json-ready dict
提供了這種〜序列化,但同樣希望使用 pydantic 進行更強大的輸入驗證,同時保持對稱。
當前版本的pydantic
不支持直接創建 jsonable dict
。 但是您可以使用以下技巧:
class Model(BaseModel):
the_id: UUID = Field(default_factory=uuid4)
print(json.loads(Model().json()))
{'the_id': '4c94e7bc-78fe-48ea-8c3b-83c180437774'}
或者通過orjson更有效
orjson.loads(Model().json())
似乎這個功能已經被提出,並且(可能)受到 pydantic 的作者 samuel colvin 的青睞,如https://github.com/samuelcolvin/pydantic/issues/951#issuecomment-552463606
它建議將simplify
參數添加到Model.dict()
到 output jsonalbe 數據。
此代碼在生產 api 層中運行,並且已執行,因此我們無法使用建議的單行解決方法(只需執行完全序列化( .json()
)+完全反序列化)。 我們實現了一個自定義的 function 來做到這一點,降低.dict()
的結果並將類型轉換為 jsonable - 希望上述提議的功能將來會添加到 pydantic。
另一種選擇是使用fastapi
中的jsonable_encoder
方法(如果您已經在使用): https://fastapi.tiangolo.com/tutorial/encoder/
該代碼看起來非常獨立,因此如果許可證允許,您可以復制粘貼它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.