【问题标题】:Filter by multiple django-taggit tags with Django Rest Framework使用 Django Rest Framework 过滤多个 django-taggit 标签
【发布时间】:2025-12-15 13:40:01
【问题描述】:

默认 SearchFilter 仅允许我们在所有提供的术语都匹配时过滤(在我的情况下为标签)。

class MyModelViewSet(viewsets.ReadOnlyModelViewSet):
    filter_backends = (filters.SearchFilter, )
    search_fields = ('tags__name',)
    serializer_class = MyModelSerializer
    model = MyModel
    queryset = MyModel.objects.all()

过滤然后使用:

http://localhost:8000/api/v1/objects/?search=tag1,tag2

使用上面的 URL,如果对象上存在所有标签,我只会获取对象。

如果提供的任何标签匹配,我是否有机会制作此过滤器以允许我过滤?

【问题讨论】:

    标签: python django tags django-rest-framework django-taggit


    【解决方案1】:

    为我工作:

    from django_filters import rest_framework as filters
    
    class TagsFilter(filters.CharFilter):
        def filter(self, qs, value):
            if value:
                tags = [tag.strip() for tag in value.split(',')]
                qs = qs.filter(tags__name__in=tags).distinct()
    
            return qs
    
    
    class MediaPublicationFilter(filters.FilterSet):
        tags = TagsFilter(name="tags")
    
        class Meta:
            model = MediaPublication
    

    【讨论】:

      【解决方案2】:

      我已经设法使用自定义过滤器后端来做到这一点:

      class TagsFilter(filters.BaseFilterBackend):
          """
          Return all objects which match any of the provided tags
          """
      
          def filter_queryset(self, request, queryset, view):
              tags = request.query_params.get('tags', None)
              if tags:
                  tags = tags.split(',')
                  queryset = queryset.filter(tags__name__in=tags).distinct()
      
              return queryset
      

      【讨论】:

        最近更新 更多