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

使用FastAPI Filter的in运算符处理含逗号的值

解决FastAPI Filter中含逗号值的in/not_in过滤问题

遇到值里带逗号导致in/not_in运算符拆分错误的情况,有几个实用的解决办法:

1. URL编码逗号

URL中逗号默认是列表分隔符,把值里的逗号换成URL编码%2C即可。比如你的值是"New York, NY",编码后变成New%20York%2C%20NY,参数就可以写成:
?address__city_in=New%20York%2C%20NY,Boston
FastAPI会自动解码URL参数,后端拿到的就是正确的["New York, NY", "Boston"]列表。

2. 自定义分隔符

如果觉得URL编码麻烦,可以修改FastAPI Filter的默认分隔符,比如改用分号;或者竖线|。只需自定义Filter类并重写split_values方法:

from fastapi_filter.contrib.sqlalchemy import Filter

class CustomBaseFilter(Filter):
    @classmethod
    def split_values(cls, value: str) -> list[str]:
        # 用分号作为列表分隔符,替换成你想要的字符即可
        return value.split(";") if value else []

# 继承自定义的Filter类来定义业务过滤规则
class AddressFilter(CustomBaseFilter):
    address__city_in: list[str] | None = None

之后参数就可以这样传:?address__city_in=New York, NY;Boston,后端会按分号拆分列表,保留值里的逗号。

3. 改用POST请求传递JSON参数

如果GET参数的方式限制太多,直接换成POST请求,把过滤条件放在JSON请求体里。这样完全不用处理分隔符问题:

from pydantic import BaseModel
from fastapi import FastAPI
from fastapi_filter.contrib.sqlalchemy import Filter

app = FastAPI()

class AddressFilter(Filter):
    address__city_in: list[str] | None = None

class FilterRequest(BaseModel):
    filter: AddressFilter

@app.post("/addresses/filter")
async def filter_addresses(request: FilterRequest):
    # 这里执行你的过滤逻辑
    addresses = await your_query_method(request.filter)
    return addresses

请求时JSON体传:

{
    "filter": {
        "address__city_in": ["New York, NY", "Boston"]
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:33:21