FastAPI-使用 Pydantic 列表字段作为查询参数的 GET 请求

2025-02-20 09:23:00
admin
原创
29
摘要:问题描述:我是 FastAPI 的新手(从 Flask 迁移),我正在尝试为我的路线创建一个 Pydantic 模型GET:from fastapi import APIRouter,Depends from pydantic import BaseModel from typing import Optio...

问题描述:

我是 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`bodyqueryDepends()GETListdirectionsbody`POST

实现此目的的方法是,要么在端点中将明确定义为单独的List参数,要么在单独的依赖项类中实现查询参数解析,如此处所述。再次记住使用 明确定义字段,以便可以将其解释为查询参数并在 URL 中多次出现(换句话说,接收多个值)。示例:directions`QueryListQuery`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"]}

现在你的代码应该可以完美运行了。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用