django - 如何在 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。
解决方案
推荐阅读
- c# - 如何使用 Visual Studio 代码将实体框架核心安装到 asp.net core 3 项目
- ecmascript-6 - 为什么使用 let 导致代码块中未定义?
- powershell - 如何将 powershell UTC 日期时间对象转换为 EST
- java - Java和hibernate一应用分离数据库
- c++ - 尽管我检查了空堆栈,但 C++ STL 堆栈弹出操作给出了段错误
- html - 使用 mysql 数据库中的数据填充 HTML 下拉列表,无需 PHP
- python - 在创建目标表达式后向 pyomo 目标添加一个常量值
- windows - 在 Git Bash 上执行脚本需要很长时间
- javascript - 当回调是类方法时删除事件监听器
- r - 基于Loop内不同数据集的过滤