使用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
相关产品推荐
相关产品推荐

