如何在Pydantic v2中使用bson.ObjectId?
Pydantic v2 中 ObjectId 与 BaseModel 兼容的等效实现
你给出的Pydantic v1版本ObjectId兼容类,在v2中需要通过__get_pydantic_core_schema__方法重构,以下是完全等效的实现:
from bson import ObjectId from pydantic_core import core_schema class PyObjectId(ObjectId): @classmethod def __get_pydantic_core_schema__(cls, source_type, handler): # 定义验证逻辑:检查输入是否为有效ObjectId def validate(v): if not ObjectId.is_valid(v): raise ValueError("Invalid objectid") return ObjectId(v) # 构建核心Schema:基础为字符串类型,添加验证和序列化规则 return core_schema.no_info_wrap_validator( validate, core_schema.union([ core_schema.is_instance(ObjectId), # 支持直接传入ObjectId实例 core_schema.str_schema() # 支持传入字符串格式的ObjectId ]), serialization=core_schema.plain_serializer_function_ser(lambda x: str(x)) )
关键说明:
- 验证逻辑整合:通过
core_schema.no_info_wrap_validator将自定义的validate方法绑定到Schema上,替代v1中的__get_validators__。 - 多类型支持:用
core_schema.union同时兼容直接传入ObjectId实例和字符串格式的ObjectId值,比v1版本更灵活。 - 序列化处理:通过
serialization参数指定序列化规则,将ObjectId自动转为字符串,对应v1中__modify_schema__定义的type="string"行为。 - Schema自动生成:Pydantic v2会根据核心Schema自动生成OpenAPI文档所需的类型定义,无需手动修改
field_schema。
所需验证器:
核心就是自定义的validate函数,负责检查输入值是否为有效的ObjectId格式,再通过Pydantic v2的核心Schema工具将其整合到类型系统中。
内容的提问来源于stack exchange,提问作者MariusSiuram
相关产品推荐
相关产品推荐

