You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:47:10