如何在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
相关产品推荐
相关产品推荐

