贝利信息

fastapi 如何让 Query 参数支持 List[str] 但允许单值输入

日期:2026-01-24 00:00 / 作者:舞夢輝影
FastAPI中Query参数接收List[str]需用Query(...)声明必填,可自动将单字符串转为单元素列表;若用Query(default=None)则报错,因Pydantic无法将str解析为list。

FastAPI 中 Query 参数接收 List[str] 但兼容单个字符串输入

FastAPI 默认对 Query 使用类型注解 List[str] 时,要求客户端必须传多个同名参数(如 ?tag=a&tag=b),否则会报 value is not a valid list 错误。但实际中常需要支持单值

?tag=foo)和多值(?tag=foo&tag=bar)两种写法。

关键在于:不能只靠类型注解,得配合 default...(Ellipsis) 显式声明可选性,并让 FastAPI 知道该字段允许“自动展开单值为列表”。

为什么直接写 List[str] 有时会报错?

常见错误现象是收到 value is not a valid listtype_error.list,本质是 Pydantic 在校验时发现传入的是 str 而非 list —— 这通常发生在:

完整可运行示例

from fastapi import FastAPI, Query
from typing import List

app = FastAPI()

@app.get("/search/")
def search(tags: List[str] = Query(..., description="标签列表,支持单值或多值")):
    return {"tags": tags}

调用效果:

想支持 ?tags=a,b 形式怎么办?

FastAPI 不原生支持逗号分隔字符串自动转列表。若必须接受这种格式,需手动处理:

最易忽略的一点:文档(Swagger UI)里不会自动显示“支持单值”,它只按 List[str] 渲染为多输入框。如果对外暴露 API,得在 description 或额外文档里说明兼容单值写法。