0%

FastAPI自学教程(61) - 数据类的高级应用

1. 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from dataclasses import dataclass
from fastapi import FastAPI

@dataclass
class Item:
name: str
price: float
description: str | None = None
tax: float | None = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
return item
  • FastAPI通过Pydantic自动转换标准数据类为Pydantic数据类
  • 核心功能支持:
    • 数据验证(自动校验字段类型)
    • 数据序列化(支持JSON转换)
    • 自动API文档生成
  • 处理流程:
    graph TD
      A[接收请求] --> B[数据类实例化]
      B --> C{Pydantic转换}
      C -->|成功| D[执行业务逻辑]
      C -->|失败| E[返回422验证错误]

2. 响应模型集成

1
2
3
4
5
6
7
8
9
10
11
12
@dataclass
class EnhancedItem:
tags: list[str] = field(default_factory=list)
stock: int = 0

@app.get("/items/next", response_model=EnhancedItem)
async def read_next_item():
return {
"name": "Moonlight Chair",
"price": 599.99,
"tags": ["家具", "现代风"]
}
  • 通过response_model参数指定响应数据结构
  • 文档生成特性:
    • Swagger UI自动展示数据类结构
    • 支持嵌套数据类显示(如列表包含子数据类)
    • 字段默认值和类型提示直观展示

3. 嵌套数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
from pydantic.dataclasses import dataclass

@dataclass
class Author:
name: str
items: list[Item] = field(default_factory=list)

@app.get("/authors/", response_model=list[Author])
def get_authors():
return [{
"name": "DesignMaster",
"items": [{"name": "ErgoDesk", "price": 1299.99}]
}]
  • 使用pydantic.dataclasses替代标准库实现复杂场景
  • 组合技巧:
    • 列表嵌套数据类(list[Item]
    • 字典与数据类混合结构
    • 继承Pydantic模型扩展功能

4. 生产环境建议

  1. 验证限制:数据类不支持Pydantic所有功能(如自定义验证器),需评估业务复杂度
  2. 文档优化:复杂结构建议使用pydantic.dataclasses保证文档正确性
  3. 性能考量:大型数据集优先使用Pydantic模型提升处理效率
  4. 版本兼容:Python 3.7+需使用from __future__ import annotations兼容类型提示

测试命令示例:

1
curl -X POST http://localhost:8000/items/ -H "Content-Type: application/json" -d '{"name":"ErgoChair", "price":799.99}'