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

如何在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))
        )

关键说明:

  1. 验证逻辑整合:通过core_schema.no_info_wrap_validator将自定义的validate方法绑定到Schema上,替代v1中的__get_validators__。
  2. 多类型支持:用core_schema.union同时兼容直接传入ObjectId实例和字符串格式的ObjectId值,比v1版本更灵活。
  3. 序列化处理:通过serialization参数指定序列化规则,将ObjectId自动转为字符串,对应v1中__modify_schema__定义的type="string"行为。
  4. Schema自动生成:Pydantic v2会根据核心Schema自动生成OpenAPI文档所需的类型定义,无需手动修改field_schema。

所需验证器:

核心就是自定义的validate函数,负责检查输入值是否为有效的ObjectId格式,再通过Pydantic v2的核心Schema工具将其整合到类型系统中。

内容的提问来源于stack exchange,提问作者MariusSiuram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:09:56