DjangoFilterBackend with multiple identifiers

I want to filter my model using django-filter . It works fine if I filter a single identifier, for example:

http://localhost:8000/accommodations?accommodationType_id=1 

But I do not know how I can filter multiple identifiers like.

 http://localhost:8000/accommodations?accommodationType_id=1,2 

My actual ViewSet as follows:

 class AccommodationViewSet(viewsets.ReadOnlyModelViewSet): """ REST API endpoint for 'accommodation' resource """ queryset = Accommodation.objects.all() serializer_class = AccommodationSerializer filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('accommodationType_id', 'name') 

I hope there is a solution.

+11
django django-rest-framework django-filter
source share
2 answers

I found the following solution for my problem :)

https://gist.github.com/aBuder/654fb945f085b17358d8

 from webapp.serializers import * from rest_framework import viewsets from rest_framework import filters from django_filters import Filter, FilterSet class ListFilter(Filter): def filter(self, qs, value): if not value: return qs # For django-filter versions < 0.13, use lookup_type instead of lookup_expr self.lookup_expr = 'in' values = value.split(',') return super(ListFilter, self).filter(qs, values) class AccommodationFilter(FilterSet): ids = ListFilter(name='id') accommodationType_ids = ListFilter(name='accommodationType_id') class Meta: model = Accommodation fields = ['ids', 'accommodationType_ids'] class AccommodationViewSet(viewsets.ReadOnlyModelViewSet): """ REST API endpoint for 'accommodation' resource """ queryset = Accommodation.objects.all() serializer_class = AccommodationSerializer filter_backends = (filters.DjangoFilterBackend,) filter_class = AccommodationFilter 
+12
source share

I know this is an old question, but it might be worth giving an updated answer.

BaseInFilter Django filter added a BaseInFilter field that can be combined with other filters to check the contents.

See Docs: https://django-filter.readthedocs.io/en/latest/ref/filters.html#baseinfilter.

For example, this will work in your case:

 from django_filters import rest_framework as filters class NumberInFilter(filters.BaseInFilter, filters.NumberFilter): pass class AccommodationFilter(filters.FilterSet): accommodationType_id_in = NumberInFilter(field_name='accommodationType_id', lookup_expr='in') class Meta: model = Accommodation fields = ['accommodationType_id_in', ] 

Then you can filter by the list of identifiers: http://localhost:8000/accommodations?accommodationType_id_in=1,2

0
source share

All Articles