从pydantic模型查询参数

cgl*_*cet 5 pydantic fastapi

有没有办法将pydantic模型转换为fastapi中的查询参数?

我的一些端点通过主体传递参数,但其他一些端点直接在查询中传递它们。所有这些端点共享相同的数据模型,例如:

class Model(BaseModel):
    x: str
    y: str
Run Code Online (Sandbox Code Playgroud)

我想避免在我的“查询参数端点”的定义中重复我对此模型的定义,例如test_query在此代码中:

class Model(BaseModel):
    x: str
    y: str

@app.post("/test-body")
def test_body(model: Model): pass

@app.post("/test-query-params")
def test_query(x: str, y: str): pass
Run Code Online (Sandbox Code Playgroud)

这样做最干净的方法是什么?

Ant*_*ony 14

查询参数列表文档中未提及的特殊情况,例如:

/members?member_ids=1&member_ids=2
Run Code Online (Sandbox Code Playgroud)

不幸的是,@cglacet 提供的答案将忽略此类模型的数组:

class Model(BaseModel):
    member_ids: List[str]
Run Code Online (Sandbox Code Playgroud)

您需要像这样修改您的模型:

 class Model(BaseModel):
     member_ids: List[str] = Field(Query([]))
Run Code Online (Sandbox Code Playgroud)

来自 GitHub 上 @fnep的回答:


cgl*_*cet 5

文档提供了避免这种重复的捷径。在这种情况下,它将给出:

from fastapi import Depends

@app.post("/test-query-params")
def test_query(model: Model = Depends()): pass
Run Code Online (Sandbox Code Playgroud)

这将允许您请求/test-query-params?x=1&y=2并为此端点生成正确的 OpenAPI 描述。

类似的解决方案可用于使用 Pydantic 模型作为表单数据描述符。

  • 哇哦,非常感谢!这让我困惑了几个月!“model: Model” 被识别为主体参数,但“model: Model = Depends()” 被识别为查询参数,这是不直观的。fastapi 文档非常好,但有时它们无法突出显示这样的关键内容。 (4认同)