
pydantic 默认不会自动使用 `alias` 进行序列化,需显式传入 `by_alias=true` 参数才能将字段别名(如 `_id`)应用于 `model_dump()` 输出,从而适配 mongodb 等外部系统对字段命名的特殊要求。
在 Pydantic v2 中,Field(alias=...) 仅定义了输入解析时的别名映射(即支持从 {"_id": "...", "name": "..."} 初始化),但默认不参与输出序列化。若希望 model_dump() 或 model_dump_json() 输出中字段以别名形式呈现(例如将 id 输出为 _id),必须显式启用 by_alias=True。
以下为正确用法示例:
from pydantic import BaseModel, Field
from uuid import uuid4
class MyDocument(BaseModel):
id: str = Field(default_factory=lambda: str(uuid4()), alias="_id")
name: str
body = {"name": "skanda"}
doc = MyDocument(**body)
# ❌ 错误:默认不使用 alias,输出为 {"id": "...", "name": "skanda"}
print(doc.model_dump())
# 输出:{'id': 'a1b2c3...', 'name': 'skanda'}
# ✅ 正确:显式指定 by_alias=True,输出为 {"_id": "...", "name": "skanda"}
print(doc.model_dump(by_alias=True))
# 输出:{'_id': 'a1b2c3...', 'name': 'skanda'}⚠️ 注意事项:
- alias 主要用于兼容不同数据源的键名约定(如 MongoDB 的 _id、REST API 的 user_id),但其作用是双向的——需配合 by_alias=True 才能影响序列化;
- 若同时需要 JSON 序列化,可使用 model_dump_json(by_alias=True);
- serialization_alias(Pydantic v2.4+)可用于仅影响序列化而不影响解析的场景,但本例中 alias 已足够;
- MongoDB 驱动(如 pymongo)通常接受字典直接插入,因此 model_dump(by_alias=True) 的输出可直接用于 collection.insert_one(...)。
总结:别名不是“自动生效”的魔法,而是需主动启用的显式行为。牢记 by_alias=True 是解锁 alias 序列化能力的关键开关。










