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

基于Pydantic schema动态生成带列表类查询参数的GET请求实现方法

解决方案

FastAPI默认会将路径函数中直接声明的Pydantic类型参数识别为请求体,要将Pydantic模型字段映射为GET查询参数,可通过以下两种方式实现:

方案一:固定模型适配(适合少量固定schema的场景)

手动将模型字段对应为查询参数,通过依赖注入返回模型实例:

from typing import List, Optional
from fastapi import APIRouter, Query, Depends
from pydantic import BaseModel

router = APIRouter()

class MySchema(BaseModel):
    a: Optional[List[int]] = None
    b: Optional[List[str]] = None

def get_inputs(
    a: List[int] = Query(None),
    b: List[str] = Query(None)
) -> MySchema:
    return MySchema(a=a, b=b)

@router.get("/findStuff")
def get_stuff(inputs: MySchema = Depends(get_inputs)):
    return inputs

该写法效果和逐个声明查询参数完全一致,OpenAPI文档可正常识别所有参数。

方案二:通用动态适配(适合任意Pydantic schema的场景)

通过泛型工厂函数动态生成依赖,无需为每个schema单独编写适配逻辑:

from typing import TypeVar, Type, Any
from pydantic import BaseModel
from fastapi import Query, Depends

T = TypeVar('T', bound=BaseModel)

def as_query(model: Type[T]) -> T:
    def dependency(**kwargs: Any) -> T:
        return model(**kwargs)
    
    annotations = {}
    kwdefaults = {}
    for field_name, field_info in model.model_fields.items():
        annotations[field_name] = field_info.annotation
        if field_info.is_required():
            kwdefaults[field_name] = Query(..., description=field_info.description)
        else:
            kwdefaults[field_name] = Query(
                field_info.default, 
                description=field_info.description,
                title=field_info.title
            )
    
    dependency.__annotations__ = annotations
    dependency.__kwdefaults__ = kwdefaults
    return Depends(dependency)

使用方式如下,直接套用任意你定义的Pydantic模型即可:

class MySchema(BaseModel):
    a: Optional[List[int]] = None
    b: Optional[List[str]] = None

@router.get("/findStuff")
def get_stuff(inputs: MySchema = as_query(MySchema)):
    return inputs

该方案支持自动继承Pydantic模型中定义的字段描述、校验规则,列表类型参数会被正确识别为多值查询参数,完全兼容OpenAPI文档的自动生成。


内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:48:00