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

FastAPI中能否设置带默认值的必填查询参数?

FastAPI 设置「必填显示+默认值」的查询参数

你遇到的问题核心是:FastAPI默认会根据是否设置default自动标记参数的必填状态——设了default就会变成可选,但你需要在OpenAPI文档中标记为必填,同时保留默认值的功能。

有两种实现方式,对应不同的实际需求:

方式一:强制文档标记为必填,允许用户不传(自动用默认值)

如果你希望用户可以不传递该参数,系统自动使用默认值,但在OpenAPI文档里显示为必填,可以通过openapi_extra手动修改参数的OpenAPI定义:

from fastapi import FastAPI, Query
from enum import Enum

app = FastAPI()

class ModelNames(str, Enum):
    first = "first"
    second = "second"
    third = "third"

@app.post("/path")
async def this_function(
    modelInstance: ModelNames = Query(
        default=ModelNames.first,
        description="a description",
        openapi_extra={"required": True}
    )
):
    return {"selected_model": modelInstance}

这样生成的OpenAPI规范会完全匹配你给出的示例:参数标记为required: true,同时带有default: "first"和枚举选项。

方式二:真正的必填参数(用户必须传递,默认值仅作 fallback)

如果你希望用户必须显式传递该参数,但如果传递的值不符合要求时使用默认值,可以结合...(表示必填)和函数内的逻辑处理:

@app.post("/path")
async def this_function(
    modelInstance: ModelNames | None = Query(
        ...,
        description="a description"
    )
):
    # 若用户传递无效值,使用默认值(需根据实际场景调整判断逻辑)
    if not modelInstance:
        modelInstance = ModelNames.first
    return {"selected_model": modelInstance}

注意

OpenAPI官方规范中,required: true的语义是「客户端必须在请求中包含该参数」,而default仅在参数非必填时生效。如果你严格遵循规范,第一种方式属于「文档层面的标记调整」,第二种才是符合规范的必填+默认值逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:21