如何将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
相关产品推荐
相关产品推荐

