You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FastAPI文档中隐藏Pydantic鉴别器字段

解决方案

直接在type字段的Field参数里添加include_in_schema=False,就能让它不在Swagger UI的文档中显示,同时保留鉴别器的功能。

修改后的代码如下:

from typing import Literal, Union
from pydantic import Field
# 请替换为你的实际导入路径
from your_module import BDCBaseModel, router

class Foo(BDCBaseModel):
    type: Literal["Foo"] = Field("Foo", exclude=True, include_in_schema=False)
    Name: str

class Bar(BDCBaseModel):
    type: Literal["Bar"] = Field("Bar", exclude=True, include_in_schema=False)
    Name: str

class Demo(BDCBaseModel):
    example: Union[Foo, Bar] = Field(discriminator="type")

路由代码保持不变:

@router.post("/demo")
async def demo(
    foo: Foo,
):
    demo = Demo(example=foo)
    return demo

原理说明

  • exclude=True:控制序列化返回数据时排除该字段,避免返回给用户无用的type值。
  • include_in_schema=False:控制该字段不生成到OpenAPI Schema中,这样Swagger UI就不会展示这个字段。
  • 鉴别器discriminator="type"依赖的是模型中实际存在的字段,而非是否出现在Schema里,所以功能不受影响。

之前改成_type私有字段失败,是因为Pydantic的鉴别器默认只会识别公共字段(非下划线开头),私有字段的处理逻辑会导致鉴别器无法找到对应字段,因此这种方法不可行。

内容的提问来源于stack exchange,提问作者HeyMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:05:25