Как добавить 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.