1

我有一个枚举类来存储一些像这样的分类值。

class Fields(str, Enum):
    text   = "text"
    para   = "para"
    images = "images"

每种类型都有 pydantic 模型。例如:

class imageModel(BaseModel):
    min_width       : int
    max_height      : int
    is_exact        : int
    is_proportional : int
    default_mode    : int
    default_quality : int

我有一个这样的字典:

type_attrs = {
    "text": textModel,
    "para": ParaModel,
    "image": imageModel
}

我有一个 FastAPI 路由,用户需要输入字段类型名称作为字符串(从 fastapi 文档中作为下拉列表)并根据选择的类型提供类型属性。如果用户选择 type = "images",则会提供相应的 pydantic 模型 "ImageModel" 供用户填写,依此类推。

选择类型名称后有什么方法可以产生对应的pydantic模型吗?

谢谢。

4

2 回答 2

1

您可以使用UnionList与您的response_model

文档中:

您可以将响应声明为两种类型的联合,这意味着响应将是两种类型中的任何一种。

Union

from typing import Union

@app.get("/my_path", response_model=Union[FirstModel, SecondModel])

List

from typing import List

@app.get("/my_path", response_model=List[FirstModel, SecondModel])
于 2021-01-21T19:58:40.857 回答
1

我不认为 FastAPI 可以支持这种类型的功能。基本上,您所要求的是基于来自 Fields 枚举的输入的动态 swagger 模型渲染。这将需要一个钩子到我相信的招摇页面。基本上,整个 swagger 页面都是在 api 运行时静态构建的。我建议您将 Fields 枚举分解为同一路线上的不同路径。

class imageModel(BaseModel):
    min_width: int
    max_height: int
    is_exact: int
    is_proportional: int
    default_mode: int
    default_quality: int


@app.post("/image")
def image(image: imageModel):
    print(image)
    return None
于 2021-01-22T18:00:45.993 回答