【发布时间】:2021-10-06 21:08:08
【问题描述】:
我有以下型号:
from pydantic import BaseModel
class A(BaseModel):
tag: str
field1: str
class B(BaseModel):
tag: str
field1: str
field2: str
我正在使用它们来定义请求正文,如下所示:
@app.post('/route')
def handle(request: typing.Union[A, B])
documentation 声明:
首先包含最具体的类型,然后是不太具体的类型
但我想知道是否有一种方法可以引导 FastAPI 根据标签选择正确的模型。目前,我所有的模型都有一个常量标签(即类型A 总是有tag = 'A')。有没有办法可以更改我的模型定义以确保分配的模型始终与请求正文中收到的标签匹配?
目前,我通过不键入 handle 函数来解决这个问题,而是专门将 tag 与模型匹配,但理想情况下我会使用 typing.Union 作为类型并确信它会得到它正确。
【问题讨论】:
-
尝试像
tag: Literal['A']一样为 A 注释标签字段(对于 B 也是如此) -
我检查了@rv.kvetch 的答案,它有效,但有一个小缺点。您在 OpenAPI 中丢失了请求的自动生成的 json 正文字段模板。
-
@rv.kvetch 对我有用,谢谢!您想将其发布为答案,我可以将其标记为答案吗?