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

FastAPI中如何让Pydantic模型的property纳入JSON响应并生成文档

解决方案

要让Pydantic模型的计算字段同时出现在JSON响应和OpenAPI文档中,最优雅的方式是使用Pydantic v2提供的ComputedField装饰器(若仍在使用v1,后面会补充兼容方案)。

修改后的代码

import uvicorn
from fastapi import FastAPI
from pydantic import Field, BaseModel, ComputedField

app = FastAPI()


class Item(BaseModel):
    id: str = Field(description="Item ID")

    model_config = {
        "json_schema_extra": {
            "examples": [{"id": "my_name", "name": "My Name"}]
        }
    }

    @ComputedField(description="自动生成的Item名称")
    def name(self) -> str:
        return self.id.replace("_", " ").upper()


@app.get("/")
async def main() -> Item:
    return Item(id="my_name")


if __name__ == "__main__":
    uvicorn.run(app)

效果说明

  • @ComputedField会标记该属性为计算字段,自动将其纳入JSON序列化输出,访问http://127.0.0.1:8000/会返回预期的{"id": "my_name", "name": "MY NAME"}。
  • 该装饰器会自动把字段信息同步到OpenAPI Schema中,在/docs页面能看到name字段的类型、描述,与示例数据匹配。

Pydantic v1兼容方案

若未升级到v2,可通过手动补充序列化逻辑和Schema信息实现:

import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel, Field, PrivateAttr

app = FastAPI()


class Item(BaseModel):
    id: str = Field(description="Item ID")
    _name: str = PrivateAttr(default=None)

    model_config = {
        "json_schema_extra": {
            "examples": [{"id": "my_name", "name": "My Name"}],
            "properties": {"name": {"type": "string", "description": "自动生成的Item名称"}}
        }
    }

    @property
    def name(self) -> str:
        if not self._name:
            self._name = self.id.replace("_", " ").upper()
        return self._name

    def dict(self, **kwargs):
        data = super().dict(**kwargs)
        data["name"] = self.name
        return data


@app.get("/")
async def main() -> Item:
    return Item(id="my_name")


if __name__ == "__main__":
    uvicorn.run(app)

此方案通过重写dict()方法将计算字段加入序列化结果,同时在json_schema_extra中补充字段Schema,确保/docs页面能正确展示该字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:35:05