Pydantic[数据验证]
Pydantic
什么是Pydantic
Pydantic是一个功能强大的Python数据验证库,它通过Python类型注解实现快速的数据验证和转换。
Pydantic 的一些主要特性:
- 类型注解:Pydantic使用类型注解来定义模型的字段类型。你可以使用Python内置的类型,自定义类型或者其他 Pydantic提供的验证类型.
- 数据验证:Pydantic自动根据模型定义进行数据验证。它会检查字段的类型、长度、范围等。
并自动报告验证错误。你可以使用ValidationError异常来捕获验证错误。 - 模型转换:Pydantic提供了从各种数据格式(例如JSON、字典)到模型实例的转换功能。它可以自动将输入数据解析成模型实例,并保留类型安全性和验证规则。
安装方式
直接通过pip安装,支持Python3.8+:
pip install pydantic
pip install pydantic-settings
基础使用
在开始使用Pydantic之前,我们需要了解它的核心概念和基本用法。Pydantic的核心是通过定义模型来实现数据验证,让这些模型类继承自BaseModel。
from pydantic import BaseModel, ValidationError
class Product(BaseModel): # 定义产品模型
id: int
name: str
price: float
try:
product = Product(id=1, name="Laptop", price="not_a_float") # 无效价格
except ValidationError as e: # 捕获验证错误
print(e.json()) # 以 JSON 格式打印错误信息
如果创建的实例不符合类型注解的要求,则会报ValidationError错误
高级操作
Pydantic还可以结合typing模块,进行默认值,可选字段属性等验证的高级操作,甚至还可以通过Emailstr类来直接验证邮件正确性,但该类依赖一个第三方模块,在使用前需要使用pipinstall email-validator进行安装后才可以使用。
ps:
特殊类型:PositiveInt(正整数)、EmailStr(邮箱格式)、HttpUrl(URL格式)等(需额外安装 pydantic[email-validator] 等依赖)。
from typing import Optional
from pydantic import BaseModel, ValidationError, EmailStr
class User(BaseModel):
username: str
email: EmailStr
age: int
phone: Optional[str] = None # 可选字段,默认值为None
try:
user = User(username="john_doe", email="invalid_email", age="twenty") # 无效邮箱和年龄
# user = User(username="john_doe", email="john@example.com", age=20) 有效
except ValidationError as e:
print(e.json()) # 以 JSON 格式打印错误信息
Field对象
field函数提供了许多参数来定制字段的行为,以下是一些常用的参数:
...: 表示该字段必填default:表示可选字段(默认为None),不能和...连用min_length和max_length:针对字符串类型的字段定义最小和最大长度限制。gt、ge、lt和le:针对数值类型的字段定义大于gt、大于等于ge、小于lt和小于等于le的限制。
from pydantic import BaseModel, ValidationError, EmailStr,Field
class User(BaseModel):
username: str = Field(..., min_length=1, max_length=20) # 字符长度限制
email: EmailStr
age: int = Field(..., ge=0, le=150) # 年龄范围限制
phone:str = Field(default="12345678901", min_length=11, max_length=11) # 可选字段,默认值和长度限制
try:
user = User(username="john_doe", email="john@example.com", age=20) # 有效数据
except ValidationError as e:
a = eval(e.json()) # 捕获并解析验证错误
print(a[0]["msg"])
finally:
print(user)
#输出如下
# username='john_doe' email='john@example.com' age=20 phone=12345678901
数据转换
模型转化为字典
使用user.model_dump()方法可以将一个模型类实例对象转化为字典类型数据。
我们稍微改写一下上面的代码作为例子
from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):
username: str = Field(..., min_length=1, max_length=20) # 字符长度限制
email: EmailStr
age: int = Field(..., ge=0, le=150) # 年龄范围限制
phone:str = Field(default="12345678901", min_length=11, max_length=11) # 可选字段,默认值和长度限制
user = User(username="john_doe", email="john@example.com", age=20)
date = User.model_dump(user) # 获取模型数据字典
print(date) # 打印数据内容
print(type(date)) # 打印数据类型
# 输出如下
# {'username': 'john_doe', 'email': 'john@example.com', 'age': 20, 'phone': 12345678901}
#
模型转化为JSON
使用user.model_dump_json()方法可以将一个模型类实例对象转化为JSON字符串。
依旧改写一下上面的例子
from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):
username: str = Field(..., min_length=1, max_length=20) # 字符长度限制
email: EmailStr
age: int = Field(..., ge=0, le=150) # 年龄范围限制
phone:str = Field(default="12345678901", min_length=11, max_length=11) # 可选字段,默认值和长度限制
user = User(username="john_doe", email="john@example.com", age=20)
date = User.model_dump_json(user) # 获取模型数据的 JSON 字符串
print(date) # 打印数据内容
print(type(date)) # 打印数据类型
# 输出如下
# {"username":"john_doe","email":"john@example.com","age":20,"phone":12345678901}
#







