Pydantic模块学习
Pydantic模块是Python中使用最广泛的数据验证库。
Pydantic具有如下特点:
- 性能:Pydantic是Python中最快的数据验证库之一
- 序列化:可以将Python对象序列化和反序列化为字典和JSON字符串
- 强大的生态:在很多库中都用Pydantic
- 定制化:Pydantic可以验证的数据类型几乎没有限制
1. 安装
可以通过pip 安装pydantic库
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pydantic
此外还有几个可选的库值得安装:
- pydantic[email] :用于对邮件地址进行验证
- pydantic-settings :用于对系统配置进行验证
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pydantic[email]pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pydantic-settings
2. 验证字段数据
Pydantic库具有多种方式验证数据
2.1 BaseModel方式
通过声明pydatic.BaseModel类的父类。在父类中通过对属性进行注解,实现数据验证效果。
from datatime import date
from uuid import UUID, uuid4
from enum import Enum
from pydantic import BaseModel, EmailStr# 定义Department枚举类型
class Department(Enum):HR = "HR"SALES = "SALES"IT = "IT"ENGINEERING = "ENGINEERING"# 定义需要进行数据验证的模型
class Employee(BaseModel):employee_id: UUID = uuid4()name: stremail: EmailStrdate_of_birth: datesalary: floatdepartment: Departmentelected_benefits: bool
当BaseModel父类中的属性注解时,表示该类的属性的数据类型应该是注解中的数据类型。如果注解中属性具有默认值,则表示该属性的值是可忽略的。
这种方式只能从如下几个方面限制数据类型:
- 属性是否是必填的
- 属性的数据类型是否满足定义
Pydantic库的工作原理
类在实例化的时候,会针对类声明中的属性注解进行验证,如果满足验证条件,这创建对应的实例对象;否则,产生ValidationError异常
# 可以正常创建的情况
employee = Employee(name = "Chris DeTuma",email = "ethan@example.com",date_of_birth = "2000-07-21",salary = 15000,department="IT",elected_benefits = True
)# 产生异常的情况
employee1 = Employee(employee_id = "123",name=False,email="ethan@example.com",date_of_birth="2000-07-21",department="IT",elected_benefits=True
)
2.2 Field方式
在数据验证的时候,如果除了对必填性和数据类型有要求外,对数据内容还有要求,此时可以通过Field方式进行设置。
Field方式定义每个属性的默认值,可以通过不同的参数,对该属性的内容进行限制。
default | 定义字段参数的默认值,和default_factory只能二选一 |
default_factory | 定义一个创建默认值的工厂方法名,可以动态进行默认值的设置。和default只能二选一 |
alias | 定义字段参数的别名,可以在实例化或序列化时,使用这些别名 |
title | 定义字段参数的标题,如果没有,则默认是字段属性的值 |
description | 定义字段参数描述 |
exclude | 表示模型序列化为JSON或dict时,转换结果中要排除此字段 |
frozen | 设置该字段不可变。该字段创建后,其值不能更改 |
repr | 在对象__repr__方法中是否隐藏 |
pattern | 正则表达式 |
strict | 定义该字段是否设置为严格模式 |
gt | 大于某个float类型的值 |
ge | 大于等于某个float类型的值 |
lt | 小于某个float类型的值 |
le | 小于等于某个float类型的值 | </