一、基础部分
1. Pydantic 简介
什么是 Pydantic?
Pydantic 是一个用于数据验证和设置管理的 Python 库,它使用 Python 类型注解(type hints)来自动验证和解析数据。它的核心功能是对输入的数据进行严格的类型检查,并确保它们符合预期的格式。Pydantic 提供了简单、快速且灵活的数据模型定义方式,广泛用于 FastAPI 中以处理请求和响应数据。
Pydantic 与其他数据验证工具的对比(如 Marshmallow、Cerberus 等)
-
Marshmallow: Marshmallow 是一个功能强大的 Python 数据序列化和反序列化库,提供了与模型字段相关的验证功能。虽然 Marshmallow 提供了类似的功能,但它的验证通常需要更多的手动配置,并且在性能上略逊色于 Pydantic。
-
Cerberus: Cerberus 是另一个 Python 数据验证库,重点是规则驱动的数据验证。它允许定义复杂的验证规则,但 Pydantic 的类型注解和数据验证更符合现代 Python 编程风格,且在性能上通常表现更好。
-
Pydantic vs Marshmallow: Pydantic 使用 Python 的数据类型注解,使得代码更简洁、更清晰,且性能更强;而 Marshmallow 更多依赖显式地定义字段验证和转换规则。
-
Pydantic vs Cerberus: Pydantic 提供了更为简便的 API 设计,通过类型注解实现数据验证,且错误处理机制更直观;Cerberus 更专注于定义和验证复杂的规则。
为什么选择 Pydantic?
选择 Pydantic 的主要原因有:
- 简洁易用:通过类型注解自动进行验证,减少了繁琐的手动验证工作。
- 性能优越:Pydantic 基于 Python 的标准库
dataclasses
和typing
,并通过 Cython 进行性能优化,速度非常快。 - 现代 Python 语法:充分利用 Python 3 的类型注解,开发者可以快速理解代码并确保类型安全。
- 与 FastAPI 集成:Pydantic 与 FastAPI 紧密集成,用于处理请求体和响应体,提供了非常方便的数据验证。
2. 安装与配置
安装 Pydantic
要安装 Pydantic,可以使用 pip 来进行安装:
pip install pydantic
这个命令会安装 Pydantic 的最新稳定版本。
示例代码:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
# 创建一个 User 实例
user = User(name='Alice', age=30)
print(user)
该示例展示了如何定义一个数据模型 User
,并且 Pydantic 会在创建实例时确保数据类型的正确性。
3. 基本使用
在本节中,我们将介绍如何使用 Pydantic 进行数据模型的创建、字段定义、数据验证、以及如何自定义错误消息。
创建 Pydantic 模型
Pydantic 中的所有数据模型都需要继承 BaseModel
类。BaseModel
提供了一个基础类,它让模型能够自动进行数据验证。
from pydantic import BaseModel
# 创建 Pydantic 模型
class User(BaseModel):
name: str
age: int
在这个例子中,我们定义了一个 User
类,继承了 BaseModel
。它有两个字段:name
和 age
,分别对应字符串类型和整数类型。
字段定义与类型
使用基本类型(int, str, float 等)
Pydantic 支持 Python 标准类型和一些额外的类型来进行字段定义和验证,常见的类型包括:int
、str
、float
、bool
、list
、dict
等。
from pydantic import BaseModel
class Product(BaseModel):
name: str
price: float
quantity: int
在这个例子中,Product
模型定义了 name
(字符串类型),price
(浮动类型)和 quantity
(整数类型)这三个字段。
类型注解与 Pydantic 类型验证
Pydantic 使用 Python 的类型注解来进行字段验证。例如,如果字段是 str
类型,Pydantic 会确保它传入的是一个字符串;如果是 int
类型,则必须传入一个整数。
class Order(BaseModel):
order_id: int
customer_name: str
total_amount: float
当你创建 Order
实例时,Pydantic 会验证传入的数据类型是否与模型中的定义一致:
order = Order(order_id=123, customer_name='Alice', total_amount=250.75)
如果你传入的数据类型不匹配,Pydantic 会抛出一个错误。
默认值和必需字段
Pydantic 支持设置字段的默认值,也支持指定哪些字段是必需的(没有默认值的字段是必需的)。
class User(BaseModel):
name: str
age: int = 30 # 默认值
email: str = None # 默认值为 None
在上面的示例中:
name
是必需字段。age
有默认值 30。email
默认值为None
,表示它是可选字段。
数据验证
Pydantic