首页 > 解决方案 > 如何在 Django rest 框架的 APIView 中添加 DjangoFilterBackend?

问题描述

我正在尝试使用 DRF 中的 APIVIEW 将所有 CRUD 操作添加到单个端点中,正如我所听说的,这就是高级开发人员所做的(所有 apis 到单个端点中)。但是在获取请求中,我必须使用 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):

如果我不在上面的 APIVIEW 中附加 get,我必须创建另一个像这样的视图。

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

现在我需要在上面的 APIVIEW 中应用 filterset_class。

标签: djangoapidjango-rest-frameworkdjango-viewsdjango-filter

解决方案


推荐阅读