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

FastAPI中使用Pydantic模型结合Depends无法解析List[int]类型多值查询参数的问题

How to parse multi-value query parameters into a Pydantic List field using Depends in FastAPI?

我之前碰到过一模一样的问题,FastAPI默认情况下,当你把Pydantic模型作为Depends()的参数接收查询参数时,不会自动把重复的查询键(比如industries=4&industries=5)解析成列表。这是因为Pydantic本身没意识到这是查询参数的多值场景,得我们明确告诉FastAPI该怎么处理这个字段。

下面给你两种可行的解决办法:

方法1:在Pydantic模型字段中使用Query

你可以在模型的industries字段上用Query来指定它是多值参数,同时设置默认值为None或者空列表。推荐结合Annotated(Python 3.9及以上版本支持)来让类型提示更清晰:

from fastapi import Depends, Query
from pydantic import BaseModel
from typing import Optional, List, Annotated

class GuestGetItemsSchema(BaseModel):
    s: Optional[str] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    # 用Annotated + Query明确指定这是多值查询参数
    industries: Optional[List[int]] = Query(None)
    page_size: Optional[int] = None
    next_token: Optional[str] = None
    previous_token: Optional[str] = None

@app.get("/api/v1/items/guest")
async def get_services(schema: GuestGetItemsSchema = Depends()):
    return schema

现在发送GET /api/v1/items/guest?industries=4&industries=5&industries=6请求,industries就会被正确解析成[4,5,6]了。如果希望默认是空列表而非None,把Query(None)改成Query([])就行。

方法2:用依赖函数手动解析

要是不想修改Pydantic模型,也可以写个依赖函数手动提取并解析查询参数:

from fastapi import Depends, Query
from pydantic import BaseModel
from typing import Optional, List

class GuestGetItemsSchema(BaseModel):
    s: Optional[str] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    industries: Optional[List[int]] = None
    page_size: Optional[int] = None
    next_token: Optional[str] = None
    previous_token: Optional[str] = None

async def get_guest_query_params(
    s: Optional[str] = None,
    latitude: Optional[float] = None,
    longitude: Optional[float] = None,
    industries: Optional[List[int]] = Query(None),
    page_size: Optional[int] = None,
    next_token: Optional[str] = None,
    previous_token: Optional[str] = None
):
    return GuestGetItemsSchema(
        s=s,
        latitude=latitude,
        longitude=longitude,
        industries=industries,
        page_size=page_size,
        next_token=next_token,
        previous_token=previous_token
    )

@app.get("/api/v1/items/guest")
async def get_services(schema: GuestGetItemsSchema = Depends(get_guest_query_params)):
    return schema

为什么原来的代码不生效?

当你直接把Pydantic模型传给Depends()时,FastAPI会把模型的每个字段当成单个查询参数处理,它不会自动识别重复的键应该合并成列表。而Query(None)则明确告诉FastAPI:这个参数可以接收多个值,要解析成列表类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 09:57:27