如何重写Django过滤器以支持单个属性多值筛选?
解决多parent筛选的正确方式
你的问题出在默认DjangoFilterBackend对多值参数的处理逻辑上——它默认只会取最后一个传入的parent值。直接重写get_queryset会和原有过滤器的逻辑冲突(比如会丢失id筛选的功能),更稳妥的方法是自定义FilterSet来实现多值筛选,同时保留原有所有功能。
步骤1:自定义FilterSet
导入必要模块后,创建专门的FilterSet类,为parent字段配置多值筛选支持:
from django_filters import rest_framework as filters from django_filters.rest_framework import FilterSet from . import models from . import serializers from rest_framework.viewsets import ModelViewSet class GroupFilterSet(FilterSet): # 配置parent字段支持多值筛选,兼容?parent=1&parent=2格式 parent = filters.ModelMultipleChoiceFilter( queryset=models.Group.objects.all(), field_name='parent', lookup_expr='exact' ) class Meta: model = models.Group fields = ['id', 'parent']
步骤2:修改ViewSet使用自定义FilterSet
把原ViewSet中的filterset_fields替换为filterset_class,指定我们刚定义的FilterSet:
class GroupViewSet(ModelViewSet): queryset = models.Group.objects.all() serializer_class = serializers.GroupSerializer filter_backends = (filters.DjangoFilterBackend,) filterset_class = GroupFilterSet
效果说明
这样修改后,你可以:
- 保留原有单值筛选:
/api/groups/?id=1、/api/groups/?parent=1 - 支持多parent筛选:
/api/groups/?parent=1&parent=2 - 同时组合多个筛选条件:
/api/groups/?id=3&parent=1&parent=2
内容的提问来源于stack exchange,提问作者Martin Kršek
相关产品推荐
相关产品推荐

