在 Pydantic v2 中使用 bson.ObjectId

2023-12-04

I found 一些例子关于如何在其中使用 ObjectIdBaseModel类。基本上,这可以通过创建 Pydantic 友好的类来实现,如下所示:

class PyObjectId(ObjectId):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        if not ObjectId.is_valid(v):
            raise ValueError("Invalid objectid")
        return ObjectId(v)

    @classmethod
    def __modify_schema__(cls, field_schema):
        field_schema.update(type="string")

然而,这似乎适用于 Pydantic v1,因为该机制已被__get_pydantic_core_schema__类方法。但是,我无法使用 Pydantic v2 实现等效的解决方案。有可能吗?我需要什么验证器?我尝试重构一些东西,但无法得到任何可用的东西。


迁移旧式PyObjectId到最新的pydantic-v2版本,最简单的方法是使用带注释的验证器.

from typing import Any
from typing import Annotated, Union
from bson import ObjectId
from pydantic import PlainSerializer, AfterValidator, WithJsonSchema

def validate_object_id(v: Any) -> ObjectId:
    if isinstance(v, ObjectId):
        return v
    if ObjectId.is_valid(v):
        return ObjectId(v)
    raise ValueError("Invalid ObjectId")

PyObjectId = Annotated[
    Union[str, ObjectId],
    AfterValidator(validate_object_id),
    PlainSerializer(lambda x: str(x), return_type=str),
    WithJsonSchema({"type": "string"}, mode="serialization"),
]

然后您可以通过以下方式在模型中使用它:

from pydantic import BaseModel
from pydantic import ConfigDict, Field

class MyCustomModel(BaseModel):
    id: PyObjectId = Field(alias="_id")

    model_config = ConfigDict(arbitrary_types_allowed=True)

使用测试一下类型适配器:

import pytest
from bson import ObjectId
from pydantic import TypeAdapter, ConfigDict
    
@pytest.mark.parametrize("obj", ["64b7992ba8f08069073f1055", ObjectId("64b7992ba8f08069073f1055")])
def test_pyobjectid_validation(obj):
    ta = TypeAdapter(PyObjectId, config=ConfigDict(arbitrary_types_allowed=True))
    ta.validate_python(obj)

@pytest.mark.parametrize("obj", ["64b7992ba8f08069073f1055", ObjectId("64b7992ba8f08069073f1055")])
def test_pyobjectid_serialization(obj):
    ta = TypeAdapter(PyObjectId, config=ConfigDict(arbitrary_types_allowed=True))
    ta.dump_json(obj)

即使使用最新的解决方案,该解决方案也能正常工作FastAPIv0.100.0+

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pydantic v2 中使用 bson.ObjectId 的相关文章

随机推荐

  • 管理文件共享上的远程 DACL:Win32_ACE 到 Win32_Share

    目标 向现有文件共享添加本地用户帐户共享级读 写权限 我在开发这个方面遇到了障碍 显然 Microsoft 希望您将用户的 ACE 添加到 DACL 然后返回到共享的安全描述符中 1 不 NET SHARE ADD 不适用于现有共享 我很惊
  • 使用龙卷风处理标准输入

    如何监听 Tornado 循环中 stdin 上发生的事件 特别是 在龙卷风系统中 我想从标准输入中读取数据 对其做出反应 并在标准输入关闭时终止 同时 Tornado Web 服务也在同一进程上运行 在寻找这个时 我能找到的最相似的是处理
  • 电子邮件身份验证(Gmail、Yahoo 等)--android [重复]

    这个问题在这里已经有答案了 我对这个主题还很陌生 是否可以一次性验证所有电子邮件 ID 实际需要是我想在我的应用程序中验证电子邮件 gmail yahoo 等 一旦验证批准 它应该继续到我的应用程序 它可能是单点登录或其他什么 这可以做到吗
  • 将对象转换为派生类的对象

    我有课Record效果很好 public class Record protected string table protected string idcolumn public Record string table string idc
  • 如何让awk忽略双引号内的字段分隔符? [复制]

    这个问题在这里已经有答案了 我需要删除逗号分隔值文件中的 2 列 考虑 csv 文件中的以下行 email protected www example com field2 field3 field4 email protected fie
  • 如何在 React 中循环一个对象?

    React 新手 尝试循环对象属性 但 React 抱怨对象不是有效的 React 子对象 有人可以给我一些关于如何解决此问题的建议吗 我已经添加了 createFragment 但不完全确定需要去哪里或者我应该采取什么方法 JS var
  • 获取 mongoid 生成的原始 mongo db 查询表达式

    我想获取 mongoid 生成的 mongo 查询表达式该怎么做 例如这是 mongoid 语法 History where report type params report type order by ts 1 only ts last
  • 在 MVC4 中使用 DotNetOpenAuth 获取 Twitter 访问密钥

    我正在使用 MVC4 创建一个应用程序 该应用程序将授权用户使用 Twitter 并允许他们也从该应用程序发送推文 我可以使用 MVC4 中的BuiltInOAuthClient Twitter 毫无问题地对用户进行身份验证 http ww
  • 如何在 Web Api 中手动执行 Breeze 过滤器?

    我想使用一些外部服务器端逻辑来修改查询结果的属性 为此 我需要应用 Breeze 查询选项 修改结果集并返回它 我基本上知道如何申请OdataQueryOptions我的查询 但我不想错过 BreezeJS 所做而 Web Api 的 OD
  • PHP 两次获取数据

    我的功能看起来就是这样 private function generateTree courseID q SELECT l id l name AS lesson name c name AS course name FROM lesson
  • 什么意思 ”!”在 require.js 中

    什么意思 当我包含模块时在 require js 中 语法是什么 在我的项目中包含动态样式表 我发现https github com martinsb require css插入 效果很好 require css css sample cs
  • 目标版本 1.8 无效

    我尝试在 OPENSHIFT 上部署我的应用程序 但 Maven 无法编译它并出现错误 目标版本 1 8 无效 我的 构建 action hook export JAVA HOME OPENSHIFT DATA DIR jdk1 8 0 0
  • Web 服务上的 X509Certificate2 验证

    我正在开发 WCF Web 服务 用于检查 XML 签名中的证书是否有效 XML 使用合格且有效的 X509 证书进行签名 当我在 Visual Studio 开发环境中运行服务时 X509Certificate2 Verify 和 X50
  • 无状态 Spring MVC

    我目前正在阅读 Spring in Action 第三版 并且一直在尝试 Spring MVC 一切正常 直到我尝试将示例 Web 应用程序 移植 到无状态 Web 应用程序 为了确定是否创建了会话对象 我在 URL映射 只打印出req g
  • 使用 jQuery 加载图像并将其附加到 DOM

    我正在尝试从给定的链接加载图像 var imgPath imgLink attr href 并将其附加到页面上 这样我就可以将其插入到给定元素中对于图像查看器 尽管我搜索过堆栈溢出和jQuery文档没有尽头 我无法弄清楚 加载图像后 我想设
  • 保护C++程序免遭反编译[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以反编译C Builder exe C Builder exe 安全吗 我使用 Microsoft Visual C 2010 Express 来编写程序 当我想分发我的程序时 我使用 发布 配
  • 如何处理JPA命名查询中数字类型的空值

    我想将两个参数传递给namedquery 一种是数字类型 另一种是字符串类型 它们都可以为空 例如 id null username joe 和 id 1 username joe 是两个不同的结果 在namedQuery中 如果id为nu
  • 找不到静态文件 - 在 Heroku 上部署 Django

    我正在尝试在 Heroku 上部署 Django 站点 但在让应用程序查找我的静态文件时遇到问题 我用过python manage py collectstatic将我的静态文件收集到 staticfiles 文件夹中 但我的应用程序似乎仍
  • HttpWebRequest 不发送 UserAgent

    我对 net 的整个 Web 端很陌生 并且遇到了一个小问题 我正在尝试执行以下 HttpWebRequest 操作 String uri https skyid sky com signup HttpWebRequest request
  • 在 Pydantic v2 中使用 bson.ObjectId

    I found 一些例子关于如何在其中使用 ObjectIdBaseModel类 基本上 这可以通过创建 Pydantic 友好的类来实现 如下所示 class PyObjectId ObjectId classmethod def get