为什么我的 Django Rest Framework 搜索过滤器不起作用?

ben*_*don 3 django filter django-rest-framework

这是我的代码。我没有收到任何错误,并且可以看到添加到可浏览 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)
Run Code Online (Sandbox Code Playgroud)

终点

http://localhost:8000/jobs/?search=something
returns the same as
http://localhost:8000/jobs/
Run Code Online (Sandbox Code Playgroud)

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

Ris*_*hiG 7

This basically doesn't work because you're trying to do too much. You've written your own get method which bypasses all the magic of the DRF views. In particular, by not calling GenericAPIView.get_object, you avoid a line that looks like

    queryset = self.filter_queryset(self.get_queryset())
Run Code Online (Sandbox Code Playgroud)

which is where the QuerySet is filtered. This simpler version, practically identical to the one in the SearchFilter docs, should work

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']
Run Code Online (Sandbox Code Playgroud)

NOTE based on your question, I am assuming:

  1. that your Job model has a name field

  2. that for some reason you've renamed the Job manager to manager via a call to models.Manager()