Pydantic 模型:调用 .dict() 时将 UUID 转换为字符串

qan*_*dev 10 python python-3.x pydantic

感谢您的时间。

.dict()当调用使用 pymongo 保存到 monogdb时,我试图将 UUID 字段转换为字符串。我尝试过,.json()但似乎 mongodb 不喜欢它 TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping

这是我到目前为止所做的:

from uuid import uuid4
from datetime import datetime
from pydantic import BaseModel, Field, UUID4

class TestModel(BaseModel):
    id: UUID4 = Field(default_factory=uuid4)
    title: str = Field(default="")
    ts: datetime = Field(default_factory=datetime.utcnow)

record = TestModel()
record.title = "Hello!"
print(record.json())
# {"id": "4d52517a-88a0-43f8-9d9a-df9d7b6ddf01", "title": "Hello!", "ts": "2021-08-18T03:00:54.913345"}
print(record.dict())
# {'id': UUID('4d52517a-88a0-43f8-9d9a-df9d7b6ddf01'), 'title': 'Hello!', 'ts': datetime.datetime(2021, 8, 18, 3, 0, 54, 913345)}
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?谢谢。


我能做的最好的事情就是在该模型内部调用一个新方法to_dict()并调用它

class TestModel(BaseModel):
    id: UUID4 = Field(default_factory=uuid4)
    title: str = Field(default="")

    def to_dict(self):
        data = self.dict()
        data["id"] = self.id.hex
        return data


record = TestModel()
print(record.to_dict())
# {'id': '03c088da40e84ee7aa380fac82a839d6', 'title': ''}
Run Code Online (Sandbox Code Playgroud)

Joh*_*eon -3

您不需要将 UUID 转换为字符串mongodb。您只需将记录作为 UUID 添加到数据库中,它会将其保存为Binary.

\n

以下是创建快速 UUID 并将其直接保存到数据库的示例:

\n
    from pydantic import BaseModel\n    from uuid import UUID, uuid4\n\n\n    class Example(BaseModel):\n        id: UUID\n        note: str\n\n\n    def add_uuid_to_db():\n        #database = <get your mongo db from the client>\n        collection = database.example_db\n        new_id: UUID = uuid4()\n        new_record = {\n            \'id\': new_id,\n            \'note\': "Hello World"\n        }\n        new_object = Example(**new_record)\n        collection.update_one(\n            filter={},\n            update={"$set": new_object.dict()},\n            upsert=True\n        )\n\n\n    if __name__ == \'__main__\':\n        add_uuid_to_db()\n
Run Code Online (Sandbox Code Playgroud)\n

这是结果记录:

\n
    {\n      "_id": {\n        "$oid": "611d1d0d6e00f4849c14a792"\n      },\n      "id": {\n        "$binary": "jyxxsFKaToupb55VUKm0kw==",\n        "$type": "3"\n      },\n      "note": "Hello World"\n    }\n
Run Code Online (Sandbox Code Playgroud)\n