FastAPI 中 Pydantic 怎么用?模型验证和数据序列化详解

文章导读
Previous Quiz Next Pydantic 是一个用于数据解析和验证的 Python 库。它利用 Python 新版本(3.6 及以上)的类型提示机制,并在运行时验证类型。Pydantic 定义了 BaseModel class,它作为创建用户定义模型的基类。
📋 目录
  1. 示例 - Pydantic 的使用
  2. 示例 - 类型转换不可行时的错误
  3. 示例 - 验证错误
A A

FastAPI - Pydantic



Previous
Quiz
Next

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, in 
    s1=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, in 
    s1=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 模型(如 SQLAlchemyPeewee)进行映射。