FastAPI-使用 Pydantic 列表字段作为查询参数的 GET 请求
- 2025-02-20 09:23:00
- admin 原创
- 30
问题描述:
我是 FastAPI 的新手(从 Flask 迁移),我正在尝试为我的路线创建一个 Pydantic 模型GET
:
from fastapi import APIRouter,Depends
from pydantic import BaseModel
from typing import Optional,List
router = APIRouter()
class SortModel(BaseModel):
field: Optional[str]
directions: List[str]
@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel)):
pass #my code for handling this route.....
当我跑步时:
curl -X GET http://localhost:XXXX/pydanticmodel?directions=up&directions=asc&field=id
我得到:
422 Unprocessable Entity: {"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}
但如果我改为directions:List[str]
, directions: str
我就会200 OK
得到directions="asc"
。
str
查询参数有效而无效的原因是什么List[str]
?我做错了什么?
谢谢。
解决方案 1:
更新
您现在可以将 包装Query()
在 中Field()
,这将允许您定义一个List
将被解释为查询参数的 Pydantic 字段:
from fastapi import FastAPI, Query, Depends
from pydantic import BaseModel, Field
from typing import List, Optional
app = FastAPI()
class SortModel(BaseModel):
field: Optional[str]
directions: List[str] = Field(Query(...))
@app.get("/")
async def get_data(criteria: SortModel = Depends()):
return criteria
请参阅此答案以了解更多详细信息和另一个工作示例。
原始答案
目前还无法使用GET
带有 PydanticList
字段作为参数的请求。当您在 Pydantic 模型中query
声明一个字段时,它将被解释为请求参数,而不是一个参数(无论使用什么——例如,您可以通过http://127.0.0.1:8000/docs上的 Swagger UI 文档进行检查)。此外,由于您正在使用请求,即使您在中添加了of并尝试发送请求,它也不会起作用,因为该操作需要请求。List
`bodyquery
Depends()GET
Listdirections
body`POST
实现此目的的方法是,要么在端点中将明确定义为单独的List
参数,要么在单独的依赖项类中实现查询参数解析,如此处所述。再次记住使用 明确定义字段,以便可以将其解释为查询参数并在 URL 中多次出现(换句话说,接收多个值)。示例:directions
`QueryList
Query`directions
from typing import List, Optional
from fastapi import FastAPI, Depends, Query
app = FastAPI()
class SortModel:
def __init__(
self,
field: Optional[str],
directions: List[str] = Query(...)
):
self.field = field
self.directions = directions
@app.get("/")
async def get_data(criteria: SortModel = Depends()):
return criteria
可以使用装饰器重写上述内容@dataclass
,如下所示:
from typing import List, Optional
from fastapi import FastAPI, Depends, Query
from dataclasses import dataclass
app = FastAPI()
@dataclass
class SortModel:
field: Optional[str]
directions: List[str] = Query(...)
@app.get("/")
async def get_data(criteria: SortModel = Depends()):
return criteria
解决方案 2:
使用 FastAPI 0.115.0,您现在可以在查询中的 BaseModel 中使用列表字段,并且它可以与 SwaggerUI 一起使用:
from fastapi import FastAPI, Query
from pydantic import BaseModel
from typing import Annotated
class FilterParams(BaseModel):
tags: list[str] = []
app = FastAPI()
@app.get("/hello")
def world(params: Annotated[FilterParams, Query()]):
return params
解决方案 3:
我遇到了同样的问题。以下解决方案可行,但这不是我真正想要的,不过也许对你来说已经足够好了:
from fastapi import APIRouter,Depends, Query
from pydantic import BaseModel
from typing import Optional,List
router = APIRouter()
class SortModel(BaseModel):
field: Optional[str]
@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel), directions: List[str] = Query(...)):
pass #my code for handling this route.....
解决方案 4:
这不是 Pydantic 或 FastAPI 的问题。
如果您想使用 curl 发送数组,则应使用-d标志。
In: curl -X GET "http://127.0.0.1:8000/pydanticmodel?field=123" -d "[\"string\"]"
Out: {"field":"123","directions":["string"]}
现在你的代码应该可以完美运行了。
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)