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

如何重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:02:28