V1 遷移到 V2
Pydantic V2 於 2023 年發布,核心以 Rust 重寫,速度大幅提升,但許多 API 名稱也跟著改變。網路上仍有大量 V1 時代的教學與程式碼,本頁提供 V1 與 V2 的 API 對照表,並介紹官方自動遷移工具 bump-pydantic,幫你看懂舊程式並完成升級。
V1 和 V2 的 API 對照
| V1 寫法 | V2 寫法 |
|---|---|
model.dict() |
model.model_dump() |
model.json() |
model.model_dump_json() |
Model.parse_obj(data) |
Model.model_validate(data) |
Model.parse_raw(s) |
Model.model_validate_json(s) |
model.copy(update=...) |
model.model_copy(update=...) |
Model.schema() |
Model.model_json_schema() |
Model.__fields__ |
Model.model_fields |
@validator("x") |
@field_validator("x") |
@validator("x", pre=True) |
@field_validator("x", mode="before") |
@root_validator |
@model_validator(mode="after") 或 mode="before" |
class Config: |
model_config = ConfigDict(...) |
orm_mode = True |
from_attributes=True |
allow_mutation = False |
frozen=True |
from pydantic import BaseSettings |
from pydantic_settings import BaseSettings(獨立套件) |
parse_obj_as(list[int], data) |
TypeAdapter(list[int]).validate_python(data) |
Optional[int](自動預設 None) |
int \| None = None(必須明確寫預設值) |
有哪些行為上的差異容易踩雷?
Optional不再自動有預設值:V1 中x: Optional[int]是選填;V2 中它是「必填,但可以是None」。要選填必須寫x: int | None = None。- 數字不會自動轉成字串:V1 會把
123轉成"123"給str欄位;V2 會報錯。 float轉int更嚴格:3.5傳給int欄位會報錯,只接受沒有小數部分的值(例如3.0)。- 驗證器必須是
@classmethod:@field_validator下方要加@classmethod。
有自動遷移工具嗎?
官方提供 bump-pydantic,會自動改寫大部分 API 名稱:
執行後務必跑一次測試,並人工檢查上一節的行為差異,工具無法判斷你的程式是否依賴舊行為。
升級到一半,可以同時用 V1 API 嗎?
可以。V2 內附一份 V1 的相容版本,大型專案可以分階段遷移:
這只是過渡用,新程式碼請一律用 V2 API。
推薦影音
Talk Python:Pydantic v2 的計畫
簡述:Pydantic 作者 Samuel Colvin 說明為什麼要用 Rust 重寫、V2 會帶來哪些改變與破壞性更新,適合想理解遷移背景的讀者。