可通过四种方法使FastAPI响应自动忽略None字段:一、序列化时传入exclude_none=True;二、路由装饰器设response_model_exclude_none=True;三、在Pydantic模型中配置默认exclude_none;四、自定义JSONResponse子类统一处理。

如果您使用 FastAPI 定义了 Pydantic 响应模型,但希望序列化时自动忽略值为 None 的字段,则可通过配置模型的序列化行为实现。以下是多种可行方法:
一、在响应模型中设置 exclude_none=True 参数
Pydantic v1 和 v2 均支持在模型实例化或序列化时通过参数控制字段排除逻辑。FastAPI 默认调用模型的 .dict()(v1)或 .model_dump()(v2)方法生成 JSON 响应,可显式传入排除参数。
1、定义响应模型类,继承自 BaseModel,确保字段允许为 Optional 类型。
2、在路由函数返回模型实例时,不直接返回实例,而是返回其序列化结果,并传入 exclude_none=True。
3、对于 Pydantic v2,使用 model.model_dump(exclude_none=True);对于 v1,使用 model.dict(exclude_none=True)。
4、将该字典作为 JSONResponse 内容返回,或在依赖项/中间件中统一处理。
二、在路由装饰器中使用 response_model_exclude_none=True
FastAPI 提供了路由级配置选项,可在 @app.get() 等装饰器中直接启用全局排除逻辑,无需修改每个模型的序列化调用。
1、在定义路由时,添加参数 response_model_exclude_none=True。
2、确保所设 response_model 为 Pydantic 模型类(非实例)。
3、FastAPI 将在内部调用模型的序列化方法时自动注入 exclude_none=True 行为。
4、该设置仅影响当前路由的响应体,不影响请求解析或验证过程。
三、为 Pydantic 模型设置默认序列化配置
可通过模型的 Config 类(v1)或 model_config(v2)声明默认导出行为,使所有对该模型的 .dict() 或 .model_dump() 调用默认排除 None 值。
1、Pydantic v1:在模型内部定义 class Config:,并设置 exclude_none = True。
2、Pydantic v2:在模型类中定义 model_config = ConfigDict(exclude_none=True)。
3、确保已从 pydantic.config 导入 ConfigDict(v2)或直接使用字典(v1)。
4、此配置会影响所有显式调用序列化方法的场景,包括 FastAPI 自动响应构造。
四、使用自定义响应类封装排除逻辑
当需跨多个路由复用且保持类型提示完整性时,可创建继承自 JSONResponse 的子类,在其 render() 方法中统一处理模型序列化。
1、定义新类如 NoneExcludingJSONResponse,重写 render 方法。
2、在 render 中检测响应内容是否为 Pydantic 模型实例。
3、若是,调用其 model_dump(exclude_none=True)(v2)或 dict(exclude_none=True)(v1)。
4、将处理后的字典转为 JSON 字节流并返回。
5、在路由中返回该响应类实例,而非原始模型。










