使用 Django Rest Framework 按多个 django-taggit 标签进行过滤

pri*_*moz 2 python tags django django-taggit django-rest-framework

默认情况SearchFilter下仅允许我们在所有提供的术语都匹配的情况下进行过滤(在我的例子中是标签)。

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

然后进行过滤:

http://localhost:8000/api/v1/objects/?search=tag1,tag2
Run Code Online (Sandbox Code Playgroud)

通过上面的 URL,我仅在对象上存在所有标签时才获取对象。

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

Vic*_*r K 8

对我有用:

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
Run Code Online (Sandbox Code Playgroud)