2016-12-22 6 views
0

По умолчанию SearchFilter позволяет нам фильтровать (теги в моем случае), если все предоставленные условия совпадают.Фильтр несколькими тегами django-taggit с Django Rest Framework

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

Filtering затем работает с:

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

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

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

ответ

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 
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 
Смежные вопросы