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

如何使用Django Filter实现多城市选择的数据筛选?

用Django Filter实现多城市筛选方案

要支持用户选择多个城市筛选游戏数据,默认的filterset_fields只能处理单值匹配,得自定义FilterSet来实现,具体操作如下:

1. 编写自定义FilterSet类

创建一个FilterSet子类,给city字段使用MultipleChoiceFilter,以此支持多城市参数筛选:

from django_filters import FilterSet, MultipleChoiceFilter
from .models import Game

class GameFilter(FilterSet):
    # 动态拉取数据库中所有不重复的城市作为筛选选项
    city = MultipleChoiceFilter(
        choices=Game.objects.values_list('city', 'city').distinct(),
        field_name='city',
        lookup_expr='exact'
    )

    class Meta:
        model = Game
        fields = ['id', 'city', 'level']

2. 更新视图配置

把原视图里的filterset_fields替换成自定义的filterset_class:

from rest_framework import generics, filters
from django_filters.rest_framework import DjangoFilterBackend
from .models import Game
from .serializers import GameSerializers
from .filters import GameFilter  # 导入刚才定义的FilterSet
from datetime import datetime

class GamesView(generics.ListAPIView):
    queryset = Game.objects.filter(start_date__gte=datetime.today())
    serializer_class = GameSerializers
    filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
    filterset_class = GameFilter  # 替换为自定义FilterSet

3. 前端传参示例

前端可以通过传递多个city参数来筛选多城市数据,比如:
GET /games/?city=北京&city=上海&level=1

接口会自动返回城市为北京或上海的游戏记录。

额外说明

  • values_list('city', 'city').distinct()的作用是从数据库中获取所有不重复的城市,确保筛选选项都是有效的,不会出现不存在的城市。
  • 如果需要支持逗号分隔的单参数(比如?city=北京,上海),可以自定义过滤逻辑,但多参数的方式已经能满足大部分场景需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:35:21