You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.1 KiB

从 Pydantic v1 迁移到 Pydantic v2

如果你有一个较旧的 FastAPI 应用,可能在使用 Pydantic v1。

FastAPI 0.100.0 同时支持 Pydantic v1 和 v2,会使用你已安装的任一版本。

FastAPI 0.119.0 引入了在 Pydantic v2 内部以 pydantic.v1 形式对 Pydantic v1 的部分支持,以便于迁移到 v2。

FastAPI 0.126.0 移除了对 Pydantic v1 的支持,但在一段时间内仍支持 pydantic.v1

/// warning | 警告

从 Python 3.14 开始,Pydantic 团队不再为最新的 Python 版本提供 Pydantic v1 的支持。

这也包括 pydantic.v1,在 Python 3.14 及更高版本中不再受支持。

如果你想使用 Python 的最新特性,需要确保使用 Pydantic v2。

///

如果你的旧 FastAPI 应用在用 Pydantic v1,这里将向你展示如何迁移到 Pydantic v2,以及 FastAPI 0.119.0 中可帮助你渐进式迁移的功能。

官方指南

Pydantic 有一份从 v1 迁移到 v2 的官方迁移指南

其中包含变更内容、校验如何更准确更严格、可能的注意事项等。

你可以阅读以更好地了解变更。

测试

请确保你的应用有测试,并在持续集成(CI)中运行它们。

这样你就可以升级并确保一切仍按预期工作。

bump-pydantic

在很多情况下,如果你使用的是未做自定义的常规 Pydantic 模型,可以将从 Pydantic v1 迁移到 v2 的大部分过程自动化。

你可以使用同一 Pydantic 团队提供的bump-pydantic

该工具会帮助你自动修改大部分需要变更的代码。

之后运行测试检查是否一切正常。如果正常,你就完成了。😎

v2 中的 Pydantic v1

Pydantic v2 以子模块 pydantic.v1 的形式包含了 Pydantic v1 的全部内容。但在 Python 3.13 以上的版本中不再受支持。

这意味着你可以安装最新的 Pydantic v2,并从该子模块导入并使用旧的 Pydantic v1 组件,就像安装了旧版 Pydantic v1 一样。

{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}

FastAPI 对 v2 中 Pydantic v1 的支持

自 FastAPI 0.119.0 起,FastAPI 也对 Pydantic v2 内的 Pydantic v1 提供了部分支持,以便迁移到 v2。

因此,你可以将 Pydantic 升级到最新的 v2,并将导入改为使用 pydantic.v1 子模块,在很多情况下就能直接工作。

{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}

/// warning | 警告

请注意,由于 Pydantic 团队自 Python 3.14 起不再在较新的 Python 版本中支持 Pydantic v1,使用 pydantic.v1 在 Python 3.14 及更高版本中也不受支持。

///

同一应用中同时使用 Pydantic v1 与 v2

Pydantic 不支持在一个 Pydantic v2 模型的字段中定义 Pydantic v1 模型,反之亦然。

graph TB
    subgraph "❌ Not Supported"
        direction TB
        subgraph V2["Pydantic v2 Model"]
            V1Field["Pydantic v1 Model"]
        end
        subgraph V1["Pydantic v1 Model"]
            V2Field["Pydantic v2 Model"]
        end
    end

    style V2 fill:#f9fff3
    style V1 fill:#fff6f0
    style V1Field fill:#fff6f0
    style V2Field fill:#f9fff3

...但是,你可以在同一个应用中分别使用 Pydantic v1 和 v2 的独立模型。

graph TB
    subgraph "✅ Supported"
        direction TB
        subgraph V2["Pydantic v2 Model"]
            V2Field["Pydantic v2 Model"]
        end
        subgraph V1["Pydantic v1 Model"]
            V1Field["Pydantic v1 Model"]
        end
    end

    style V2 fill:#f9fff3
    style V1 fill:#fff6f0
    style V1Field fill:#fff6f0
    style V2Field fill:#f9fff3

在某些情况下,甚至可以在 FastAPI 应用的同一个路径操作中同时使用 Pydantic v1 和 v2 模型:

{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}

在上面的示例中,输入模型是 Pydantic v1 模型,输出模型(在 response_model=ItemV2 中定义)是 Pydantic v2 模型。

Pydantic v1 参数

如果你需要在 Pydantic v1 模型中使用 FastAPI 特有的参数工具,如 BodyQueryForm 等,在完成向 Pydantic v2 的迁移前,可以从 fastapi.temp_pydantic_v1_params 导入它们:

{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}

分步迁移

/// tip | 提示

优先尝试 bump-pydantic,如果测试通过且可行,那么你就用一个命令完成了。

///

如果 bump-pydantic 不适用于你的场景,你可以在同一应用中同时支持 Pydantic v1 和 v2 模型,逐步迁移到 Pydantic v2。

你可以首先将 Pydantic 升级到最新的 v2,并将所有模型的导入改为使用 pydantic.v1

然后按模块或分组,逐步把模型从 Pydantic v1 迁移到 v2。🚶