Фильтр диапазона не работает в django rest вообще не реагирует при фильтрации

#django #rest

#django #отдых

Вопрос:

Фильтр диапазона не работает в django rest вообще не реагирует при фильтрации

Вид

 class MDShopListView(generics.ListAPIView):
        queryset = smartphone.objects.all()
        filter_backends = (DjangoFilterBackend,)
        filterset_class = ShoppFilter
        def get(self,request):
    
            queryset = self.get_queryset()
            serializer=MDShopListSerializer(queryset,many=True)
            
        
            return Response(serializer.data)



            
 

Ответ №1:

Вам нужно отфильтровать набор запросов с помощью self.filter_queryset(…) [drf-doc]:

 class MDShopListView(generics.ListAPIView):
    queryset = smartphone.objects.all()
    filter_backends = (DjangoFilterBackend,)
    filterset_class = ShoppFilter
    
    def get(self, request):
        queryset = self.filter_queryset(self.get_queryset())
        serializer=MDShopListSerializer(queryset,many=True)
        return Response(serializer.data) 

Но на самом деле переопределение get(…) не требуется, поскольку теперь оно делает почти то же, что и a ListAPIView по умолчанию, за исключением того, что вы не разбиваете на страницы. Действительно, a ListAPIView определяется как [GitHub]:

 class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs) 

и .list(…) метод определен в ListModelMixin виде [GitHub]:

     def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data) 

Таким образом, вы можете определить это как:

 class MDShopListView(generics.ListAPIView):
    queryset = smartphone.objects.all()
    filter_backends = (DjangoFilterBackend,)
    filterset_class = ShoppFilter
    # specify the serializer ↓
    serializer_class = MDShopListSerializer