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

