基于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
相关产品推荐
相关产品推荐

