【问题标题】:How can I guide FastAPI to pick the right type type from Union如何引导 FastAPI 从 Union 中选择正确的类型类型
【发布时间】: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 对我有用,谢谢!您想将其发布为答案,我可以将其标记为答案吗?

标签: python fastapi pydantic


【解决方案1】:

来自@rv.kvetch 的评论,将tag 字段注释为字符串文字,例如Literal['A'] 表示每次都选择了正确的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多