Pydantic - Python数据验证与模型库完全指南
Pydantic是一个强大的Python数据验证库,通过类型注解进行数据验证和设置管理,特别适用于FastAPI等现代Web框架
Pydantic - Python数据验证与模型库完全指南
📝 概述
Pydantic 是一个用于数据验证和设置管理的 Python 库,特别适用于 FastAPI 等框架。它通过定义数据模型来确保数据的有效性和一致性,利用Python的类型注解来执行运行时数据验证。
Pydantic的核心理念是”使用Python类型注解进行数据验证”,它能够:
- 在运行时验证数据类型的正确性
- 提供清晰的错误信息
- 序列化和反序列化数据
- 与现代IDE完美集成,提供类型提示
官方文档: https://docs.pydantic.dev/
中文文档: https://pydantic.com.cn/
GitHub地址: https://github.com/pydantic/pydantic
🎯 学习目标
- 掌握 Pydantic 的基本概念和 BaseModel 用法
- 学会定义数据模型和使用类型注解进行验证
- 掌握默认值、可选字段和嵌套模型的使用
- 学会创建自定义验证器和验证逻辑
- 了解数据序列化和反序列化的方法
- 掌握在 FastAPI 等框架中集成 Pydantic 的最佳实践
📋 前置知识
- Python 基础语法和面向对象编程
- Python 类型注解(Type Hints)的基本使用
- 字典、列表等基本数据结构操作
- 异常处理机制
🔧 安装
使用 pip 安装 Pydantic:
# 安装基础版本
pip install pydantic
# 安装完整版本(包含email验证等额外功能)
pip install "pydantic[email]"
# 安装Pydantic v2(推荐)
pip install "pydantic>=2.0"
🔍 详细内容
基本概念
Pydantic 的核心是 BaseModel 类,通过继承这个类来定义数据模型:
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: str
创建实例与自动验证
创建模型实例时,Pydantic 会自动验证数据类型:
# 正确的数据
user = User(id=1, name="John Doe", email="john@example.com")
print(user)
# 错误的数据类型会抛出验证错误
try:
user = User(id="not-an-int", name="John Doe", email="john@example.com")
except ValueError as e:
print(e) # 打印验证错误信息
使用默认值和可选字段
你可以为字段设置默认值,或者使用 Optional 来定义可选字段:
from typing import Optional
class User(BaseModel):
id: int
name: str
email: str
age: Optional[int] = None # 可选字段,默认值为 None
嵌套模型
Pydantic 支持嵌套模型,可以在一个模型中使用另一个模型:
class Address(BaseModel):
street: str
city: str
state: str
class User(BaseModel):
id: int
name: str
email: str
address: Address # 嵌套模型
# 创建嵌套模型实例
address = Address(street="123 Main St", city="Anytown", state="CA")
user = User(id=1, name="John Doe", email="john@example.com", address=address)
print(user)
数据序列化和反序列化
Pydantic 模型可以方便地进行 JSON 序列化和反序列化:
# 转换为字典
user_dict = user.model_dump() # v1中为 .dict()
print(user_dict)
# 转换为 JSON
user_json = user.model_dump_json() # v1中为 .json()
print(user_json)
# 从字典创建模型实例
user_from_dict = User(**user_dict)
自定义验证器
你可以定义自定义验证器来实现更复杂的验证逻辑(v2使用 field_validator/model_validator,v1使用 validator):
# v2 写法
from pydantic import BaseModel, field_validator
class User(BaseModel):
id: int
name: str
email: str
@field_validator('email')
@classmethod
def email_must_be_valid(cls, v: str) -> str:
if "@" not in v:
raise ValueError('Invalid email address')
return v
# v1 写法
from pydantic import validator
class UserV1(BaseModel):
id: int
name: str
email: str
@validator('email')
def email_must_be_valid_v1(cls, v):
if "@" not in v:
raise ValueError('Invalid email address')
return v
💡 实际应用
基础用法
# 基础模型的创建与验证
user = User(id=1, name="Alice", email="alice@example.com")
print(user.model_dump())
高级用法
# 通过模型间嵌套组织更复杂的数据结构
class Company(BaseModel):
name: str
owner: User # 嵌套User模型
company = Company(name="Acme", owner=user)
print(company.model_dump())
实际案例
# 实际场景:注册时的跨字段验证(v2写法)
from pydantic import BaseModel, model_validator
class RegisterForm(BaseModel):
username: str
password: str
confirm_password: str
@model_validator(mode='after')
def check_passwords(self):
if self.password != self.confirm_password:
raise ValueError('Password mismatch')
return self
⚠️ 注意事项
- v1 与 v2 API 存在差异:v2 推荐使用
model_dump/model_validation/field_validator/model_validator等新接口 - 复杂嵌套可能带来性能开销,注意在高频路径中的使用
- 如果需要设置赋值时验证,请开启
validate_assignment(v2 在ConfigDict中设置)
🔗 相关内容
📚 扩展阅读
🏷️ 标签
pydantic 数据验证 BaseModel FastAPI 类型注解 数据建模
最后更新: 2024-01-16
作者: Python技术文档工程师
版本: 1.0
讨论与反馈
欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。