6

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

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

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

我想避免在我的“查询参数端点”的定义中重复我对这个模型的定义,例如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

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

4

2 回答 2

7

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

from fastapi import Depends

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

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

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

于 2020-06-19T10:37:56.843 回答
0

如果您的架构是“最小” ,则此解决方案非常合适。

但是,当涉及到这样一个复杂的,使用 Pydantic 模型在 swagger doc 中设置查询参数的描述时,最好使用“自定义依赖类”

from fastapi import Depends, FastAPI, Query

app = FastAPI()


class Model:
    def __init__(
            self,
            y: str,
            x: str = Query(
                default='default for X',
                title='Title for X',
                deprecated=True
            )

    ):
        self.x = x
        self.y = y


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

如果您使用此方法,您将对 OpenAPI 文档有更多的控制权。

于 2020-10-15T07:39:00.897 回答