为何Pydantic无法将id序列化为"_id"?如何适配MongoDB?
解决方法
1. 调用model_dump()时指定by_alias=True
Pydantic的model_dump()默认不会使用字段别名输出,需要显式传入by_alias=True参数,才能让id字段以别名_id序列化。修改后的代码:
from pydantic import BaseModel, Field, UUID1 from uuid import uuid1 class myown(BaseModel): id: UUID1 = Field(default_factory=uuid1, alias="_id") name: str body = {"name": "skanda"} data = myown(**body) # 启用别名序列化 print(data.model_dump(by_alias=True)) # 输出示例: {'_id': UUID('xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), 'name': 'skanda'}
2. 适配MongoDB的UUID存储格式
MongoDB默认用ObjectId作为_id,直接存入Python的UUID对象会被序列化为字符串,后续查询易出问题。可以借助bson库将UUID转为Mongo支持的BSON二进制格式:
from pydantic import BaseModel, Field, UUID1 from uuid import uuid1 from bson import Binary, UUID_SUBTYPE class myown(BaseModel): id: UUID1 = Field(default_factory=uuid1, alias="_id") name: str # 自定义方法生成Mongo适配格式 def model_dump_mongo(self): dumped = self.model_dump(by_alias=True) dumped["_id"] = Binary(dumped["_id"].bytes, UUID_SUBTYPE) return dumped body = {"name": "skanda"} data = myown(**body) mongo_data = data.model_dump_mongo()
3. 插入MongoDB示例
结合PyMongo完成数据插入:
from pymongo import MongoClient client = MongoClient("mongodb://localhost:27017/") db = client["test_db"] collection = db["test_col"] # 插入自定义UUID的文档 collection.insert_one(mongo_data)
这样就能确保存入MongoDB的_id是你定义的UUID,而非Mongo自动生成的ObjectId。
内容的提问来源于stack exchange,提问作者ProxilityProblemSolver
相关产品推荐
相关产品推荐

