DjangoFilterBackend с несколькими идентификаторами
Я хочу отфильтровать мою модель с помощью django-filter. Он отлично работает, если я фильтрую один идентификатор, например:
http://localhost:8000/accommodations?accommodationType_id=1
Но я не знаю, как я могу фильтровать несколько идентификаторов вроде.
http://localhost:8000/accommodations?accommodationType_id=1,2
Мой фактический ViewSet
выглядит следующим образом:
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')
Я надеюсь, что есть решение.
Ответы
Ответ 1
Я нашел следующее решение для своей проблемы:)
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
Ответ 2
Я знаю, что это старый вопрос, но, возможно, стоит дать обновленный ответ.
BaseInFilter
Django-фильтра добавили поле BaseInFilter
которое можно комбинировать с другими фильтрами для проверки содержимого.
См. Документы: https://django-filter.readthedocs.io/en/latest/ref/filters.html#baseinfilter.
Например, это будет работать в вашем случае:
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', ]
Тогда вы сможете фильтровать по списку идентификаторов: http://localhost:8000/accommodations?accommodationType_id_in=1,2