【问题标题】:Search filter not working in Rest framework搜索过滤器在 Rest 框架中不起作用
【发布时间】:2021-04-28 09:51:49
【问题描述】:

搜索过滤器在此工作正常,需要使用用户定义的距离过滤掉列表,为此编写了一个 get 函数。现在,过滤器不见了。当我注释掉 get 函数时它就会出现。

class ServiceProviderList(generics.ListAPIView):
        queryset = ProfileCompletion.objects.all()
        serializer_class=ProfilecompletioneSerializer
        filterset_class=SnippetFilter  
        filter_backends = [DjangoFilterBackend,SearchFilter]
        filterset_fields = ['fullname', 'category','departments','services']
        search_fields = ['fullname', 'category__name','departments__dept_name','services__service_name']
   
    def get(self,request,*args, **kwargs): 
        pk=self.kwargs.get('pk')
        customer = CustomerProfile.objects.get(user=pk)
        Dist = request.GET.get("distance")
        rad=float(Dist)
        radius=rad/111
        print(radius)
        query = ProfileCompletion.objects.filter(location__distance_lte=(customer.location,radius))
        serializer = ProfilecompletioneSerializer(query,many=True)
        data = serializer.data
        return Response({"message":"Listed Successfully.","data":data})

【问题讨论】:

  • 分页也一样。在设置中全局调用。

标签: django rest django-rest-framework


【解决方案1】:

您正在失去所有功能,因为您覆盖了错误的方法。你应该重写 get_queryset 方法,而不是 get() 方法:

class ServiceProviderList(generics.ListAPIView):
        queryset = ProfileCompletion.objects.all()
        serializer_class=ProfilecompletioneSerializer
        filterset_class=SnippetFilter  
        filter_backends = [DjangoFilterBackend,SearchFilter]
        filterset_fields = ['fullname', 'category','departments','services']
        search_fields = ['fullname', 'category__name','departments__dept_name','services__service_name']
   
    def get_queryset(self,*args, **kwargs):
        qset = super().get_queryset(*args, **kwargs)
        pk=self.kwargs.get('pk')
        customer = CustomerProfile.objects.get(user=pk)
        dist = self.request.GET.get("distance")
        rad=float(dist)
        radius=rad/111
        return qset.filter(location__distance_lte=(customer.location,radius))

【讨论】:

  • get_queryset() 接受 1 个位置参数,但给出了 2 个。这是我遇到的错误
  • 对不起。现在应该修好了
  • 它成功了,搜索过滤器出现了。但搜索和过滤现在不起作用。
  • 已修复。但必须调用与另一个模型的距离而不是动态的。
猜你喜欢
  • 2020-06-07
  • 2019-07-23
  • 2017-10-06
  • 2015-03-12
  • 1970-01-01
  • 2022-01-08
  • 2018-08-23
  • 2018-11-28
  • 2016-08-04
相关资源
最近更新 更多