Как добавить DjangoFilterBackend в APIView фреймворка Django rest?

Я пытаюсь добавить все CRUD-операции в одну конечную точку с помощью APIVIEW в DRF, поскольку я слышал, что так делают старшие разработчики (все apis в одну конечную точку). Но в get request мне нужно использовать Filterbackends, пагинацию, а также некоторую пользовательскую логику фильтрации.

У меня получилось добавить пользовательскую пагинацию и логику пользовательского фильтра внутри функции get, но возникли проблемы с добавлением класса Filterset_class.

Вот мое мнение:

class LeadsView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, pk=None, *args, **kwargs):

        id = pk
        if id is not None:
            abc = Lead.objects.get(id=id)
            serializer = LeadSerializer(abc)
            return Response(serializer.data,status=status.HTTP_200_OK)
        else:
            source = self.request.GET.get("source", None)  #
            lead_status = self.request.GET.get("lead_status", None)
            if source is not None:
                source_values = source.split(",")
                if lead_status is not None:
                    lead_status_values = lead_status.split(",")
                    abc = Lead.objects.filter(source__in=source_values, lead_status__in=lead_status_values)
                else:
                    abc = Lead.objects.filter(source__in=source_values)
                paginator = CustomPagination()
                result_page = paginator.paginate_queryset(abc, request)
                serializer = LeadSerializer(result_page,many=True)
            elif lead_status is not None:
                lead_status_values = lead_status.split(",")
                if source is not None:
                    source_values = source.split(",")
                    abc = Lead.objects.filter(lead_status__in=lead_status_values, source__in=source_values)
                else:
                    abc = Lead.objects.filter(lead_status__in=lead_status_values)
                paginator = CustomPagination()
                result_page = paginator.paginate_queryset(abc, request)
                serializer = LeadSerializer(result_page,many=True)
            else:
                abc = Lead.objects.all()
                paginator = CustomPagination()
                result_page = paginator.paginate_queryset(abc, request)
                serializer = LeadSerializer(result_page,many=True)
            # return Response(serializer.data,status=status.HTTP_200_OK)
            return paginator.get_paginated_response(serializer.data)

    def post(self,request,*args,**kwargs):

Если я не добавлю get внутри приведенного выше APIVIEW, мне придется сделать другое представление, которое будет выглядеть так.

.
from .filter import LeadsFilter
class LeadAPIView(ListAPIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    queryset = Lead.objects.all().order_by('-date_created')
    serializer_class = LeadSerializer
    filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
    pagination_class = CustomPagination
    # filterset_fields = [ 'email','first_name','last_name','phone']
    filterset_class = LeadsFilter

Необходимо применить filterset_class в приведенном выше APIVIEW.

Вернуться на верх