You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:42:07