介绍
Pydantic 是一个非常流行的 Python 数据验证和设置管理库,它基于 Python 类型注解(Type Hints)工作,能自动校验数据类型和值的合法性,广泛用于 API 开发(如 FastAPI)、数据解析、配置管理等场景。
优点
- 类型校验:基于类型注解自动校验输入数据的类型(如 int、str、list 等);
- 数据转换:自动将合法的输入转换为目标类型(如字符串 “123” 转为 int 123);
- 错误提示:校验失败时返回清晰的错误信息,便于调试;
- 易集成:与 FastAPI、Django、SQLAlchemy 等框架无缝配合。
V2版本
Pydantic v2 是 2023 年 6 月发布的重大版本,核心用 Rust 重写,性能比 v1 快 5–50 倍,同时带来更严谨的类型校验、全新的验证器与序列化 API、原生计算字段等能力。下面从核心变革、安装使用、模型定义、校验、序列化、配置、迁移与实战几方面详细说明。
核心变革(v1 → v2)
1. 性能飞跃
- 底层验证引擎由纯 Python 改为 Rust 实现(pydantic-core),解析/验证速度提升 5–50 倍,内存占用更低。
- schema 构建与实例化大幅优化,适合高并发、大数据场景。
2. API 重构(关键更名)
| 功能 | Pydantic v1 | Pydantic v2 |
|---|---|---|
| 基类 | BaseModel |
BaseModel(兼容,推荐新写法) |
| 配置类 | class Config: |
model_config = ConfigDict(...) |
| 字段验证器 | @validator |
@field_validator |
| 模型验证器 | @root_validator |
@model_validator |
| 序列化 | .dict() / .json() |
.model_dump() / .model_dump_json() |
| 从 ORM 实例创建 | orm_mode = True |
from_attributes = True |
| 自定义根模型 | __root__ 字段 |
RootModel 类 |
3. 类型系统增强
- 原生支持 PEP 695(类型参数)、PEP 696(类型默认值)。
- 严格类型(
StrictStr/StrictInt等)默认更严格,减少隐式转换(如'1'不再自动转1)。 Annotated成为推荐方式,显式绑定类型与元数据。
4. 新特性
@computed_field:原生支持计算字段,替代@property序列化方案。- 精细化序列化:
@field_serializer/@model_serializer自定义字段/模型序列化。 - 结构化错误:错误信息更友好、分层,便于调试与前端展示。
安装 Pydantic
首先需要安装 Pydantic(推荐安装最新的 v2 版本,性能和功能更优):
# 安装基础版本
pip install pydantic
# 若需要兼容旧版(v1)特性,可安装兼容包
pip install pydantic[compat]
基础用法
Pydantic 的核心是 BaseModel 类,所有数据模型都需要继承它。下面是最基础的示例:
from pydantic import BaseModel, ValidationError
# 定义数据模型(基于类型注解)
class User(BaseModel):
name: str # 必选字段,字符串类型
age: int # 必选字段,整数类型
email: str | None # 可选字段,字符串或 None(Python 3.10+ 写法)
is_active: bool = True # 有默认值的字段,可选
# 1. 正确的数据示例(自动校验+转换)
user_data = {
"name": "张三",
"age": "25", # 字符串会自动转为 int
"email": "zhangsan@example.com"
}
user = User(**user_data)
print(user.name) # 输出:张三
print(user.age) # 输出:25(int 类型)
# 转为字典/JSON
print(user.model_dump()) # 转为字典
print(user.model_dump_json()) # 转为 JSON 字符串
# 2. 错误的数据示例(校验失败)
bad_user_data = {
"name": 123, # 类型错误(应为 str)
"age": "二十五" # 无法转为 int
}
try:
User(**bad_user_data)
except ValidationError as e:
print(e.json()) # 输出清晰的错误信息
进阶用法
Pydantic 支持更精细的校验规则,比如字段长度、数值范围、正则匹配等,需要用到 Field 函数:
from pydantic import BaseModel, Field, EmailStr
class User(BaseModel):
# 姓名:字符串,长度 2-10
name: str = Field(min_length=2, max_length=10)
# 年龄:整数,18-100 之间
age: int = Field(ge=18, le=100, description="用户年龄(18-100)")
# 邮箱:自动校验邮箱格式(需安装 email-validator:pip install email-validator)
email: EmailStr
# 手机号:正则匹配(中国大陆手机号)
phone: str = Field(pattern=r"^1[3-9]\d{9}$")
# 正确示例
valid_user = User(
name="李四",
age=30,
email="lisi@example.com",
phone="13812345678"
)
print(valid_user)
# 错误示例(手机号格式错误)
try:
User(
name="李四",
age=30,
email="lisi@example.com",
phone="12345678901"
)
except ValidationError as e:
print(e)
应用场景
- API 数据校验(FastAPI 核心依赖):
FastAPI 内置 Pydantic,定义请求体/响应体时直接用 Pydantic 模型,自动完成数据校验和接口文档生成。 - 配置管理:
解析配置文件(如 JSON/YAML)时,用 Pydantic 模型校验配置项的类型和值,避免配置错误。 - 数据解析:
处理外部数据(如 CSV、数据库返回值)时,用 Pydantic 校验数据格式,确保数据合规。
总结
- Pydantic 是基于 Python 类型注解的数据验证库,核心是
BaseModel类,能自动校验数据类型和值的合法性; - 核心优势是类型校验、自动转换、清晰的错误提示,是 FastAPI 等框架的核心依赖;
- 进阶用法可通过
Field函数定义精细的校验规则(长度、范围、正则等),满足复杂场景需求。