有没有办法从 FastAPI 自动生成的文档中排除 Pydantic 模型?

ale*_*ull 8 python pydantic fastapi

有没有办法让 FastAPI 应用程序不在其架构文档中显示模型?我有一些模型与其他模型略有不同,并且每个模型都发生重复,因此模式文档非常混乱。

from pydantic import BaseModel
class A(BaseModel):
    name: str

class HasID(BaseModel):
    id_: int

class AWithID(A, HasID):
    pass
Run Code Online (Sandbox Code Playgroud)

有没有办法不在AWithID文档中显示类?

Gin*_*pin 4

它并不优雅,但您可以手动修改自动生成的 OpenAPI 架构。

请参阅FastAPI 文档的扩展 OpenAPI部分。

应用程序FastAPI(实例)有一个.openapi()预期返回 OpenAPI 架构的方法。

/openapi.json作为应用程序对象创建的一部分,将注册(或您设置的 openapi_url 的任何内容)的路径操作 。

它只是返回一个 JSON 响应以及应用程序方法的结果 .openapi()

默认情况下,该方法的.openapi()作用是检查属性 .openapi_schema以查看它是否有内容并返回它们。

如果没有,它会使用 处的实用函数生成它们 fastapi.openapi.utils.get_openapi

从 的输出来看get_openapi(),所有模型都在components>下定义schemas,其中每个模型的名称是字典键。

{
    "openapi": "3.0.2",
    "info": {...},
    "paths": {...},
    "components": {
        "schemas": {
            "A": {
                "title": "A",
                "required": [...],
                "type": "object",
                "properties": {...}
            },
            "AWithID": {
                "title": "AWithID",
                "required": [...],
                "type": "object",
                "properties": {...}
            },
            "HasID": {
                "title": "HasID",
                "required": [...],
                "type": "object",
                "properties": {...}
            },
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以pop关闭要隐藏的模型:

from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi

app = FastAPI()

# Define routes before customizing the OpenAPI schema
# ...

def custom_openapi():
    if app.openapi_schema:
        return app.openapi_schema

    openapi_schema = get_openapi(title="My App", version="1.0.0", routes=app.routes)
    openapi_schema["components"]["schemas"].pop("AWithID", None)
    
    app.openapi_schema = openapi_schema
    return app.openapi_schema


app.openapi = custom_openapi
Run Code Online (Sandbox Code Playgroud)