Pydantic 基础教程
以下是一份 最系统、最实用、最现代的《Python Pydantic 全面指南》,覆盖 Pydantic v1 与 v2(最新版),从入门到进阶、到 FastAPI 实战的最核心内容。
内容重点:
- 概念 + 基础 + 验证
- Pydantic Model + Field
- 解析 / 序列化
- 自定义验证器
- FastAPI 场景
- 项目最佳实践
Pydantic 是 Python 的 数据模型与数据验证库,主要功能:
- 自动类型转换(type coercion)
- 自动校验数据格式
- 优雅的错误信息
- JSON 友好
- 超快(Rust 加速,自 v2)
特别适合:
- 接口输入/输出(FastAPI 默认用它)
- 配置文件加载(env / json / yaml)
- DTO(业务传输对象)
- 数据清洗与转换
from pydantic import BaseModel, Field
class User(BaseModel):
id: int
name: str
active: bool = True
u = User(id="1", name="Tom") # 自动把 "1" 转成 int
print(u)
输出:
id=1 name='Tom' active=True
class User(BaseModel):
id: int = Field(..., gt=0, description="用户ID")
name: str = Field(min_length=1, max_length=50)
age: int | None = Field(default=None, ge=0, le=120)
常用参数:
| 参数 | 作用 |
|---|---|
| default / 默认值 | 字段的默认值 |
| gt / ge / lt / le | 数值范围 |
| min_length / max_length | 字符串长度 |
| regex | 正则匹配 |
| description | 文档描述(FastAPI 自动生成) |
User(id="123", name=456)
自动输出:
id=123 name='456'
User.model_validate({"id": "1", "name": "Tom"})
从 JSON 字符串:
User.model_validate_json('{"id": 1, "name": "Tom"}')
u.model_dump()
u.model_dump_json()
可选:
u.model_dump(exclude={"active"})
class Address(BaseModel):
city: str
zip: str
class User(BaseModel):
name: str
address: Address
使用:
User(name="Tom", address={"city": "Beijing", "zip": "100000"})
Pydantic 会自动把 dict 转为 Address 对象。
class Group(BaseModel):
name: str
members: list[User]
两种写法等价:
email: str | None = None
# or
from typing import Optional
email: Optional[str] = None
from enum import Enum
class Status(str, Enum):
ACTIVE = "active"
DISABLED = "disabled"
class User(BaseModel):
name: str
status: Status
from pydantic import field_validator
class User(BaseModel):
name: str
@field_validator("name")
@classmethod
def validate_name(cls, v):
if not v[0].isupper():
raise ValueError("name must start with uppercase")
return v
from pydantic import model_validator
class Rectangle(BaseModel):
width: int
height: int
@model_validator(mode="after")
def check_area(self):
if self.width * self.height > 10000:
raise ValueError("Too large")
return self
class Config(BaseModel, frozen=True):
host: str
port: int
cfg = Config(host="localhost", port=3306)
# cfg.host = "127.0.0.1" # ❌ 错误
class User(BaseModel):
id: int
name: str
class Admin(User):
role: str
非常适合读取 .env:
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
app_name: str = "MyApp"
debug: bool = False
class Config:
env_file = ".env"
settings = Settings()
.env 内容自动加载。
from pydantic import BaseModel
from fastapi import FastAPI
app = FastAPI()
class User(BaseModel):
name: str
age: int
@app.post("/user/")
def create_user(user: User):
return user
FastAPI 自动:
- 接收 JSON -> 校验 -> 转换 -> 注入 User 对象
- 自动生成 OpenAPI 文档
- 错误自动返回 422
User.model_json_schema()
可以生成前端表单 / 类型系统使用的数据结构。
| 功能 | v1 | v2 |
|---|---|---|
| 验证 | Python 实现 | Rust 超高速 |
| 语法 | @validator | @field_validator |
| 方法 | .dict() .json() | model_dump() model_dump_json() |
| 自定义校验 | 已废弃 | 更统一、更强 |
| 性能 | 较慢 | 8~30 倍提升 |
建议全面使用 v2。
- API 输入输出模型(最常见)
- SQLAlchemy ORM <-> DTO 映射
- Redis / MQ 消息结构
- 配置文件(Settings)
- 表单校验
- Excel / CSV 数据清洗
- 大型项目的数据规范化
你可以在项目中创建:
utils/
├── models/
│ ├── user.py
│ ├── news.py
│ ├── common.py
例如:
class PageParams(BaseModel):
pageIndex: int = Field(ge=1)
pageSize: int = Field(ge=1, le=200)
非常适合分页、DTO 封装。
Pydantic 是 Python 的核心数据工具,它:
- 让数据结构类型化
- 让数据验证自动化
- 让项目更安全可靠
- 在 FastAPI 中体验最佳