Фильтр по нескольким тегам 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()

Затем фильтрация работает с:

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

С указанным выше URL-адресом я получаю объекты только в том случае, если все теги присутствуют на объекте.

Есть ли шанс, что я могу сделать этот фильтр, чтобы я мог фильтровать, если какой-либо из предоставленных тегов совпадает?


person primoz    schedule 22.12.2016    source источник


Ответы (2)


Работает на меня:

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
person Victor K    schedule 01.11.2017

Мне удалось сделать это с помощью пользовательского фильтра:

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
person primoz    schedule 22.12.2016