【问题标题】:Why is my Django Rest Framework Search filter not working?为什么我的 Django Rest Framework 搜索过滤器不起作用?
【发布时间】:2019-12-17 15:01:07
【问题描述】:

这是我的代码。我没有收到任何错误,我可以看到添加到可浏览 API 的搜索按钮。但问题是搜索不起作用。无论我在搜索中输入什么内容,它都会返回每个对象。

from rest_framework import status, filters

class JobView(GenericAPIView):

    serializer_class = JobSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['name']

    def get_queryset(self):
        return Job.manager.all()

    def get(self, request, format=None):
        queryset = self.get_queryset()

        if queryset.exists():
            serializer = JobSerializer(queryset, many=True)
            return Response(serializer.data)
        else:
            return Response({"Returned empty queryset"}, status=status.HTTP_404_NOT_FOUND)

端点

http://localhost:8000/jobs/?search=something
returns the same as
http://localhost:8000/jobs/

无论我在搜索字符串中输入什么,它都会返回工作。

【问题讨论】:

    标签: django filter django-rest-framework


    【解决方案1】:

    这基本上是行不通的,因为你试图做的太多了。您已经编写了自己的 get 方法,它绕过了 DRF 视图的所有魔力。特别是,通过不调用GenericAPIView.get_object,可以避免出现类似

    的行
        queryset = self.filter_queryset(self.get_queryset())
    

    这是 QuerySet 被过滤的地方。这个更简单的版本,实际上与the SearchFilter docs 中的版本相同,应该可以工作

    from rest_framework import status, filters, generics
    
    class JobView(generics.LisaAPIView):
        queryset = Job.manager.all()
        serializer_class = JobSerializer
        filter_backends = [filters.SearchFilter]
        search_fields = ['name']
    

    注意根据您的问题,我假设:

    1. 您的 Job 模型有一个 name 字段

    2. 由于某种原因,您通过调用 models.Manager()Job 管理器重命名为 manager

    【讨论】:

      【解决方案2】:

      我认为您应该根据您通过 GET 发送的参数过滤您的查询集,因为它不会自动发生。使用request.query_params.get('search') 访问您的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2014-07-31
        • 1970-01-01
        相关资源
        最近更新 更多