FastAPI - Pydantic
Pydantic 是一个用于数据解析和验证的 Python 库。它利用 Python 新版本(3.6 及以上)的类型提示机制,并在运行时验证类型。Pydantic 定义了 BaseModel class,它作为创建用户定义模型的基类。
以下代码基于 BaseModel 定义了一个 Student class 作为模型。
from typing import List from pydantic import BaseModel class Student(BaseModel): id: int name :str subjects: List[str] = []
Student class 的属性使用类型提示声明。请注意,subjects 属性是 typing 模块中定义的 List 类型,同时也是内置的 list 类型。
示例 - Pydantic 的使用
我们可以使用 model_dump 以匹配结构的字典来填充 Student class 的对象,如下所示 −
main.py
from typing import List
from pydantic import BaseModel
class Student(BaseModel):
id: int
name :str
subjects: List[str] = []
data = {
'id': 1,
'name': 'Ravikumar',
'subjects': ["Eng", "Maths", "Sci"],
}
s1=Student(**data)
print(s1)
print(s1.model_dump())
输出
运行代码并验证输出。
id=1 name='Ravikumar' subjects=['Eng', 'Maths', 'Sci']
{'id': 1, 'name': 'Ravikumar', 'subjects': ['Eng', 'Maths', 'Sci']}
示例 - 类型转换不可行时的错误
Pydantic 会在可能的情况下自动转换数据类型。例如,即使字典中的 id 键被赋值为数字的字符串表示(如 '123'),它也会将其强制转换为整数。但如果无法转换,则会抛出异常。
main.py
from typing import List
from pydantic import BaseModel
class Student(BaseModel):
id: int
name :str
subjects: List[str] = []
data = {
'id': 1,
'name': 'Ravikumar',
'subjects': ["Eng", "Maths", "Sci"],
}
s1=Student(**data)
输出
运行代码并验证输出。
Traceback (most recent call last): File "D:\Projects\python\myenv\main.py", line 15, ins1=Student(**data) File "D:\Projects\python\myenv\Lib\site-packages\pydantic\main.py", line 250, in __init__ validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) pydantic_core._pydantic_core.ValidationError: 1 validation error for Student id Input should be a valid integer [type=int_type, input_value=[1, 2], input_type=list] For further information visit https://errors.pydantic.dev/2.12/v/int_type
示例 - 验证错误
Pydantic 还包含一个 Field 类,用于为模型属性声明元数据和验证规则。首先修改 Student 类,在 name 属性上应用 Field 类型,如下所示 −
from typing import List from pydantic import BaseModel, Field class Student(BaseModel): id: int name :str = Field(None, title="The description of the item", max_length=10) subjects: List[str] = []
按以下方式填充数据。此处的 name 超过了规定的 max_length。Pydantic 会如预期般抛出 ValidationError。
main.py
from typing import List
from pydantic import BaseModel, Field
class Student(BaseModel):
id: int
name :str = Field(None, title="The description of the item", max_length=10)
subjects: List[str] = []
data = {
'id': 1,
'name': 'Ravikumar Sharma',
'subjects': ["Eng", "Maths", "Sci"],
}
s1=Student(**data)
输出
运行代码并验证输出。
Traceback (most recent call last): File "D:\Projects\python\myenv\main.py", line 14, ins1=Student(**data) File "D:\Projects\python\myenv\Lib\site-packages\pydantic\main.py", line 250, in __init__ validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) pydantic_core._pydantic_core.ValidationError: 1 validation error for Student name String should have at most 10 characters [type=string_too_long, input_value='Ravikumar Sharma', input_type=str] For further information visit https://errors.pydantic.dev/2.12/v/string_too_long
Pydantic 模型可以与 ORM 模型(如 SQLAlchemy 或 Peewee)进行映射。