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
.
以下是创建快速 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