如何引导FastAPI从Union中选择正确的类型类型?



我有以下模型:

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])

文档说明:

首先包含最具体的类型,然后是不太具体的类型

但是我想知道是否有一种方法可以指导FastAPI根据标记选择正确的模型。目前,我所有的模型都有一个常量标签(即类型A总是有tag = 'A')。是否有一种方法可以改变我的模型定义,以确保分配的模型始终与请求体中收到的标记匹配?

目前,我通过不输入我的handle函数来解决这个问题,而不是专门将tag与模型匹配,但理想情况下,我只是使用typing.Union作为类型,并确信它是正确的。

From @rv。kvetch的注释,将tag字段注释为字符串字面值,例如Literal['A']意味着每次都选择正确的类型。

将此应用于上面的问题,代码将更改为:
class A(BaseModel):
tag: Literal['A']
field1: str
class B(BaseModel):
tag: Literal['B']
field1: str
field2: str