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

如何在Django REST Framework中实现多标签过滤功能?

解决DRF多值过滤问题的正确方案

问题根源分析

  1. 错误使用过滤类:你当前用CharFilter配合lookup_expr='in'是错误的,CharFilter仅支持单字符串输入,而in查询需要接收列表类型参数,这直接导致单值和多值过滤均失效。
  2. 重复过滤调用:在get_queryset中手动调用filter_queryset会导致查询集被两次过滤,干扰视图默认的过滤逻辑,引发异常行为。

修正步骤

1. 调整ProductFilter使用InFilter

将CharFilter替换为专门处理多值in查询的InFilter:

# filters.py
import django_filters
from django_filters import filters
from .models import Product

class ProductFilter(django_filters.FilterSet):
    country__title = filters.InFilter(field_name="country__title", lookup_expr='in')
    fzg_segment__title = filters.InFilter(field_name="fzg_segment__title", lookup_expr='in')

    class Meta:
        model = Product
        fields = ["country__title", "fzg_segment__title"]

2. 修复视图的get_queryset方法

移除get_queryset中的filter_queryset调用,让视图默认逻辑处理过滤:

class ProductsSummaryView(mixins.ListModelMixin, viewsets.GenericViewSet):
    """Viewset to return data for products in a workspace"""
    serializer_class = serializers.ProductSerializer
    permission_classes = (permissions.IsWorkspaceAdminPermission,)
    pagination_class = StandardSetPagination
    filter_backends = [DjangoFilterBackend]
    filterset_class = filters.ProductFilter

    def get_queryset(self) -> models.Product:
        """Returns queryset of all the products of a workspace"""
        workspace = self.kwargs["workspace"]
        workspace = get_object_or_404(models.Workspace, pk=workspace)
        return workspace.products.all()

使用方式

  • 单值过滤:?country__title=Japan
  • 多值过滤:?country__title=Japan,Korea(用逗号分隔多个值)

如果需要支持多参数格式(如?country__title=Japan&country__title=Korea),可以自定义过滤器类兼容两种格式,但逗号分隔是DRF结合django-filter的标准实现方式。

内容的提问来源于stack exchange,提问作者Khubaib Khawar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:55:16