如何在FastAPI文档中将Pydantic联合类型的指定模型标记为弃用?
给联合类型中的特定模型标记弃用并在FastAPI文档中显示
要实现把Log模型的user字段里的SimpleUser标记为弃用,有两种可行方案,可根据你的需求选择:
方案一:全局标记SimpleUser模型为弃用
如果SimpleUser模型本身已不再推荐使用,直接给它添加JSON Schema扩展属性,所有用到该模型的地方都会在文档中显示弃用状态:
from typing import Union from pydantic import BaseModel, Field class Admin(BaseModel): name: str class SimpleUser(BaseModel): age: int # 添加全局弃用标记 model_config = {"json_schema_extra": {"deprecated": True}} class Log(BaseModel): user: Union[Admin, SimpleUser, None] = Field(default=None)
FastAPI会自动读取该配置,在Swagger UI文档中,SimpleUser对应的Schema会被标记为弃用(通常显示删除线或标注deprecated)。
方案二:仅在Log的user字段中标记SimpleUser为弃用
如果只想在Log的user字段范围内弃用SimpleUser,不影响其他地方使用该模型,需要自定义OpenAPI Schema:
from typing import Union, Dict, Any from fastapi import FastAPI from pydantic import BaseModel, Field from fastapi.openapi.utils import get_openapi class Admin(BaseModel): name: str class SimpleUser(BaseModel): age: int class Log(BaseModel): user: Union[Admin, SimpleUser, None] = Field(default=None) app = FastAPI() # 示例接口,用于生成文档 @app.post("/submit-log") def submit_log(log: Log): return {"status": "success", "log": log} def custom_openapi() -> Dict[str, Any]: # 缓存已生成的Schema避免重复处理 if app.openapi_schema: return app.openapi_schema # 生成基础OpenAPI Schema openapi_schema = get_openapi( title="Log Service API", version="1.0.0", routes=app.routes, ) # 定位到Log模型的user字段的联合类型定义 log_schema = openapi_schema["components"]["schemas"]["Log"] user_anyOf = log_schema["properties"]["user"]["anyOf"] # 遍历联合类型,给SimpleUser对应的引用添加弃用标记 for schema_item in user_anyOf: if schema_item.get("$ref") == "#/components/schemas/SimpleUser": schema_item["deprecated"] = True app.openapi_schema = openapi_schema return openapi_schema # 替换默认的OpenAPI生成函数 app.openapi = custom_openapi
启动服务后,在Swagger UI中查看Log的user字段,SimpleUser选项会被标记为弃用,而其他场景下使用SimpleUser不受影响。
内容的提问来源于stack exchange,提问作者Bastien B
相关产品推荐
相关产品推荐

