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

如何将Python API POST请求的JSON默认值设为null?

解决FastAPI中POST请求JSON默认值设为null的问题

要让所有字段默认值为null,核心是正确配置Pydantic模型,FastAPI会基于模型自动处理请求和生成文档。你之前的问题可能是没结合字段类型定义和示例配置,下面是具体解决方案:

1. 定义允许为null的字段类型 + 默认值

首先,需要为每个字段声明允许None的类型(用Optional或Python 3.10+的| None),同时设置default=None,这样字段既可选(不传的话默认是null),也支持传入null值。

示例代码:

from typing import Optional
from pydantic import BaseModel, Field
from fastapi import FastAPI

app = FastAPI()

class InputModel(BaseModel):
    foo: Optional[int] = Field(default=None, example=None)
    bar: Optional[int] = Field(default=None, example=None)
    baz: Optional[str] = Field(default=None, example=None)

@app.post("/api/endpoint")
async def process_input(data: InputModel):
    return {"received": data.dict()}

如果不需要单独设置每个字段的示例,也可以简化写法:

class InputModel(BaseModel):
    foo: Optional[int] = None
    bar: Optional[int] = None
    baz: Optional[str] = None

2. 统一设置API文档的示例(可选)

如果希望Swagger UI等API文档里的请求示例直接显示null结构,可以通过模型的Config类统一配置schema_extra:

class InputModel(BaseModel):
    foo: Optional[int] = None
    bar: Optional[int] = None
    baz: Optional[str] = None

    class Config:
        schema_extra = {
            "example": {
                "foo": None,
                "bar": None,
                "baz": None
            }
        }

为什么之前的方法没生效?

  • 只写Field(default=None)但没声明字段允许None:Pydantic会认为字段类型是int/str,即使默认值是None,文档仍会显示类型的默认示例(0、"string"),且请求时如果不传字段可能触发类型校验错误。
  • Field(example=None)单独使用:如果字段类型不允许None,文档不会显示null示例,因为类型本身的约束会覆盖示例设置。

补充:必填但允许null的场景

如果要求字段必须传入,但值可以是null,不需要设置default=None,只需要声明类型允许None:

class InputModel(BaseModel):
    foo: int | None = Field(example=None)  # Python 3.10+写法
    bar: Optional[int] = Field(example=None)
    baz: str | None = Field(example=None)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:57:17