Python中,from pydantic import BaseModel的理解
1、from pydantic import BaseModel,经常可以看到这个写法,pydantic这个库是用来处理什么问题的?另外BaseModel又有什么作用?
是一个用于数据验证和设置管理的 Python 库。它的主要作用是简化数据的验证、转换和管理,特别是在需要处理和验证外部输入(比如 JSON 请求体、文件上传、环境变量等)时。
Pydantic
它结合了数据验证和类型注解,提供了清晰和强类型的数据模型。
Pydantic 的作用:
-
数据验证:它可以自动验证传入数据是否符合预定的类型和格式。例如,可以用它来验证 JSON 请求中字段的类型、范围、格式等是否符合要求。
-
数据转换:除了验证,Pydantic 还可以将输入数据转换成所需的类型。例如,它会将字符串类型的日期转换成 Python 的
datetime类型,或者将字符串表示的数字转换成整型等。 -
清晰的模型定义:通过继承
BaseModel类,可以为数据模型提供清晰的定义,使代码更加规范和易于维护。 -
错误处理:当数据验证失败时,Pydantic 会抛出详细的错误信息,方便你快速定位问题。
BaseModel 的作用:
BaseModel 是 Pydantic 中的一个基类,所有的模型都需要继承它。它的主要作用是提供一些基本功能,如数据验证、序列化、数据转换等。
-
字段验证:你可以在模型中定义字段,并且为每个字段指定类型和验证规则。比如,某个字段必须是整数,或者一个字符串的长度不能超过指定的值。
-
数据实例化:通过继承
BaseModel,你可以轻松创建一个数据实例,自动对传入的数据进行验证。例如,Pydantic 会确保你创建的实例中字段的值类型正确。 -
模型序列化与反序列化:Pydantic 提供了
.dict()和.json()方法,方便你将模型对象转换成字典或 JSON 格式进行存储或传输。你也可以通过.parse_obj()方法将外部数据(如字典或 JSON)转换成模型实例。
例子:
from pydantic import BaseModel class User(BaseModel): name: str age: int email: str # 创建实例 user = User(name="John", age=30, email="john.doe@example.com") # 自动验证 print(user.name) # "John" print(user.age) # 30 print(user.email) # "john.doe@example.com" # 转换成字典 print(user.dict()) # {'name': 'John', 'age': 30, 'email': 'john.doe@example.com'}
在这个例子中,User 继承了 BaseModel,并且定义了三个字段:name、age 和 email。Pydantic 会自动验证这些字段的数据类型。
当我们实例化 User 时,它会验证输入数据的类型是否符合模型定义。
2、将1中提到的pydantic和BaseModel每个作用,都举出具体的例子来说明
下面是1中提到的 Pydantic 和 BaseModel 每个作用,提供具体的代码示例来更详细地说明。
1. 数据验证
Pydantic 会自动验证数据是否符合指定的类型、范围等规则。验证失败时,会抛出 ValidationError 错误,帮助你快速定位问题。
例子:
from pydantic import BaseModel, ValidationError class User(BaseModel): name: str age: int email: str try: # 验证失败,age 应该是整数,但传入了一个字符串 user = User(name="John", age="thirty", email="john.doe@example.com") except ValidationError as e: print(e)
输出:
1 validation error for User age value is not a valid integer (type=type_error.integer)
这里,Pydantic 会验证 age 是否为整数。如果传入的数据类型不符合要求,它会抛出详细的错误信息。
2. 数据转换
Pydantic 会自动转换数据类型,如果字段的数据类型与定义不符,它会尽量进行类型转换。
例子:
from pydantic import BaseModel class Product(BaseModel): price: float quantity: int # 输入为字符串形式的数字,Pydantic 会自动转换为对应类型 product = Product(price="19.99", quantity="10") print(product)
输出:
price=19.99 quantity=10
虽然输入的 price 和 quantity 是字符串,Pydantic 会自动将它们转换为 float 和 int 类型。
3. 清晰的模型定义
通过继承 BaseModel,我们能够定义清晰的数据模型,并且给每个字段指定数据类型。这样代码更加规范,且易于理解和维护。
例子:
from pydantic import BaseModel from typing import List class Book(BaseModel): title: str author: str pages: int genres: List[str] # 创建一个实例 book = Book( title="The Great Gatsby", author="F. Scott Fitzgerald", pages=180, genres=["Fiction", "Classic"] ) print(book)
输出:
title='The Great Gatsby' author='F. Scott Fitzgerald' pages=180 genres=['Fiction', 'Classic']
这个例子清晰地展示了如何定义一个书籍的模型,包含了多个字段,如 title、author、pages 和 genres。通过继承 BaseModel,我们不仅明确了数据类型,还能轻松进行数据验证和转换。
4. 错误处理
当数据不符合模型的要求时,Pydantic 会抛出详细的错误信息,这对于调试和数据验证非常有用。
例子:【这个例子不对,后面会详细展开解释】
from pydantic import BaseModel, ValidationError class User(BaseModel): username: str email: str age: int # 要改成age: conint(ge=0)这样才会报错如下, 其中conint是 constraint int的缩写 try: # email 字段缺失,age 字段传入了一个负数 user = User(username="john_doe", email="john.doe@example.com", age=-5) except ValidationError as e: print(e)
输出:【实际并不会输出如下结果,而是输出为空】
1 validation error for User age ensure this value is greater than or equal to 0 (type=value_error.number.not_ge; limit_value=0)
在这个例子中,age 被要求是大于或等于 0 的整数。当传入负值时,Pydantic 会返回一个详细的错误信息,指示数据不符合要求。
5. 模型实例化
你可以通过继承 BaseModel 定义的模型来方便地创建数据实例,并确保数据符合验证规则。
例子:
from pydantic import BaseModel class Item(BaseModel): name: str description: str price: float # 创建实例并进行验证 item = Item(name="Laptop", description="A powerful laptop", price=1200.5) print(item)
输出:
name='Laptop' description='A powerful laptop' price=1200.5
通过 BaseModel 继承,我们可以方便地创建 Item 类的实例,确保字段类型符合定义。
6. 模型序列化与反序列化
Pydantic 提供了 .dict() 和 .json() 方法,允许你将模型对象转换成字典或 JSON 格式。这对于数据存储和传输非常有用。
例子:
from pydantic import BaseModel class User(BaseModel): username: str email: str is_active: bool # 创建实例 user = User(username="john_doe", email="john.doe@example.com", is_active=True) # 转换为字典 user_dict = user.dict() print(user_dict) # 转换为 JSON user_json = user.json() print(user_json)
输出:
{'username': 'john_doe', 'email': 'john.doe@example.com', 'is_active': True}
{"username": "john_doe", "email": "john.doe@example.com", "is_active": true}
通过 .dict() 和 .json() 方法,你可以很容易地将模型实例转换为字典或 JSON 格式,用于存储或传输。
7. 反向转换(parse_obj)
你可以使用 BaseModel.parse_obj() 方法将字典或 JSON 数据转换为模型实例。这可以方便地将外部传入的数据转换成你定义的模型。
例子:
from pydantic import BaseModel class Product(BaseModel): name: str price: float in_stock: bool # 模拟外部传入的字典数据 data = {'name': 'Phone', 'price': 599.99, 'in_stock': True} # 使用 parse_obj 将字典转换为模型实例 product = Product.parse_obj(data) print(product)
输出:
name='Phone' price=599.99 in_stock=True
在这个例子中,我们用 parse_obj 方法将一个字典数据转换成了 Product 类的实例,Pydantic 会验证字典数据中的类型是否符合模型要求。
4、除了对整数的约束,列出所有其他的约束
from pydantic import conlist # 创建一个受约束的列表,包含至少 1 个元素,但最多 5 个元素 tags: conlist(str, min_items=1, max_items=5)
5. conset(受约束的集合)
用于约束集合的大小(set 类型),类似于 conlist。
例子:
from pydantic import conset # 创建一个受约束的集合,包含至少 1 个元素,但最多 5 个元素 categories: conset(str, min_items=1, max_items=5)
6. conbytes(受约束的字节串)
用于约束字节串的大小和长度。
例子:
from pydantic import conbytes # 创建一个受约束的字节串,长度介于 5 和 20 之间 data: conbytes(min_length=5, max_length=20)
7. condatetime(受约束的日期时间)
用于约束 datetime 对象的范围。
ge:大于或等于le:小于或等于gt:大于lt:小于
例子:
from pydantic import condatetime from datetime import datetime # 创建一个受约束的日期时间,必须大于等于当前时间 timestamp: condatetime(ge=datetime.now())
8. EmailStr(邮箱字符串类型)
这是一个专门用于验证电子邮件地址的类型,确保字符串符合电子邮件的格式。
例子:
from pydantic import EmailStr # 确保电子邮件地址格式正确 email: EmailStr
9. AnyUrl(任意 URL 类型)
用于验证任何有效的 URL。
例子:
from pydantic import AnyUrl # 确保字段值是有效的 URL website: AnyUrl
10. IPv4Address 和 IPv6Address
这些类型用于验证 IPv4 和 IPv6 地址。
例子:
from pydantic import IPv4Address, IPv6Address # 验证 IPv4 地址 ip_address_v4: IPv4Address # 验证 IPv6 地址 ip_address_v6: IPv6Address
11. UUID
用于验证 UUID 字符串格式。
例子:
from pydantic import UUID # 验证 UUID 格式 user_id: UUID
总结:
Pydantic 提供了多种约束类型来确保数据的合法性,并帮助我们更好地进行数据验证。
常见的约束类型包括 conint、constr、condecimal、conlist 等,以及专门验证特定格式的数据类型,如 EmailStr、AnyUrl、IPv4Address 等。
通过这些约束,我们可以确保数据的准确性,并简化数据验证的工作。

浙公网安备 33010602011771号