如何让Pydantic的ApiResponse根据接口动态指定data列表模型类型?
实现泛型API响应模型(支持动态data元素类型)
当然可以实现,你需要利用Pydantic的泛型支持来定义可复用的ApiResponse模型,具体实现步骤如下:
1. 导入必要模块
首先要引入泛型相关的类型工具:
from typing import Optional, List, TypeVar, Generic from pydantic import BaseModel
2. 定义类型变量与泛型响应模型
先声明一个类型变量T,用来指代动态变化的data元素类型,再让ApiResponse继承泛型基类Generic[T]:
# 定义类型变量,用于接收不同的模型类型 T = TypeVar('T') class ApiResponse(BaseModel, Generic[T]): success: bool data: Optional[List[T]] = [] message: Optional[str] = None meta: Optional[dict] = {}
3. 定义业务模型
你的User模型无需改动:
class User(BaseModel): name: str favorite_sandwich: str
4. 在FastAPI路由中使用泛型模型
直接通过ApiResponse[User]的方式指定响应模型和返回类型即可:
from fastapi import APIRouter router = APIRouter() @router.get("/users", response_model=ApiResponse[User]) async def get_users() -> ApiResponse[User]: # 模拟从数据库获取数据的逻辑 users = models.User.all() count = models.User.count() return {"success": True, "data": users, "meta": {"count": count}}
额外说明
- FastAPI完全兼容这种泛型响应模型的用法,会自动根据传入的
T类型完成数据校验、序列化和文档生成 - 如果需要支持单个对象而非列表,只需将
data的类型改为Optional[T] = None即可灵活调整 - 确保你的Pydantic版本在1.8及以上(泛型支持在该版本后更稳定)
内容的提问来源于stack exchange,提问作者Frank Conry
相关产品推荐
相关产品推荐

