2015-07-17 2 views
1

У меня есть конечная точка пользователя, работающая нормально, с различными фильтрами FilterBackends. Я пытаюсь добавить новый фильтр, чтобы иметь возможность передавать список идентификаторов, таких как ?ids=1,5,7, и возвращать только этих пользователей.Интерфейс фильтра Django Rest Framework и класс фильтра

Я нашел следующий фильтр, который завершал, но потом ломает мои другие фильтры:

class ListFilter(Filter): 
    def filter(self, qs, value): 
     if not value: 
      return qs 

     self.lookup_type = 'in' 
     values = value.split(',') 
     return super(ListFilter, self).filter(qs, values) 


class UserListFilter(FilterSet): 
    ids = ListFilter(name='id') 

    class Meta: 
     model = get_user_model() 
     fields = ['ids'] 


class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    filter_backends = (SearchFilter, DjangoFilterBackend, OrderingFilter, InterestsFilter) 
    filter_fields = ('username', 'native_language', 'country', 'interests',) 
    ordering_fields = ('username',) 
    search_fields = ('first_name', 'last_name') 
    filter_class = UserListFilter 

Перед добавления в этом обычае filter_class всех фильтров движки работают нормально, но затем после добавления в filter_class, он разбивает их все, но я могу затем фильтровать список идентификаторов.

В файле filtering docs они приводят пример использования обоих бэкэндов и фильтра, поэтому я думаю, что это должно сработать, но это что-то не так с моим кодом. Есть идеи?

+0

У меня была аналогичная проблема при попытке смешать filter_backends с filter_class. Но потом я обнаружил, что django-filter также имеет возможность упорядочивать результаты, и это то, что мне нужно, поэтому я просто определил фильтр упорядочения с использованием django-фильтра и остановился с использованием filter_backends этого класса. – Lukasz

ответ

2

Вы можете переопределить метод get_queryset и получить функциональность фильтрации по ids.

def get_queryset(self): 
    ids = self.request.query_params.get('ids') # List of ids 
    if ids: 
     return User.objects.all().filter(id__in=ids) # returned queryset filtered by ids 
    return User.objects.all() # return whole queryset 
+1

спасибо! Это намного чище. 'ids []' не работает для меня btw django 1.8 drf 3.1.2, необходимо изменить на 'ids', а затем разбить строку – awwester

Смежные вопросы