You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework员工端请假搜索/过滤功能失效问题求助

问题:员工端请假申请过滤/搜索/排序功能失效,管理员端正常

在基于Django REST Framework开发的请假系统中,员工端无法搜索自身提交的已批准状态请假申请,过滤、搜索、排序功能全部失效,但管理员端对应功能可正常运行。

相关代码

Views.py

class LeaveList(APIView):

    authentication_classes = [SessionAuthentication, BasicAuthentication, TokenAuthentication]
    permission_classes = [IsAuthenticated]  

    filter_backends = [DjangoFilterBackend,SearchFilter,OrderingFilter]
    ordering_fields = ['apply_date','number_of_days','status']
    search_fields = ['status']
    filter_fields = ['status']

    def get(self, request, format=None):
        employee = request.user

        filter_backends = [DjangoFilterBackend,SearchFilter,OrderingFilter]
        search_fields = ['status']

        queryset = LeaveApplicationModel.objects.filter(employee_id=employee.id)
        serializer_class = LeaveApplicationsListSerializer(queryset, many=True)

        return Response(data=serializer_class.data)

Serializers.py

class LeaveApplicationsListSerializer(serializers.ModelSerializer):
  
    class Meta:
        model = LeaveApplicationModel
        exclude = ['id', 'employee']

问题原因

APIView不会自动识别并应用filter_backends、search_fields等配置项——这些配置是为GenericAPIView及其子类(如ListAPIView)设计的。当前代码中,你在get方法里直接获取了当前员工的请假申请queryset,但完全没有执行过滤、搜索、排序的逻辑,直接序列化了原始queryset,所以这些功能都不会生效。管理员端正常是因为它的视图应该用了GenericAPIView子类,自动处理了这些逻辑。

解决方案

方案1:改用ListAPIView(推荐)

直接继承ListAPIView,它会自动处理过滤、搜索、排序逻辑,同时你只需重写get_queryset来限定当前员工的数据:

from rest_framework.generics import ListAPIView

class LeaveList(ListAPIView):
    authentication_classes = [SessionAuthentication, BasicAuthentication, TokenAuthentication]
    permission_classes = [IsAuthenticated]  
    serializer_class = LeaveApplicationsListSerializer
    
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    ordering_fields = ['apply_date','number_of_days','status']
    search_fields = ['status']
    filter_fields = ['status']

    def get_queryset(self):
        # 只返回当前登录员工的请假申请
        return LeaveApplicationModel.objects.filter(employee_id=self.request.user.id)

方案2:在APIView中手动处理过滤逻辑

如果坚持用APIView,需要在get方法中手动调用各个filter backend的逻辑:

class LeaveList(APIView):
    authentication_classes = [SessionAuthentication, BasicAuthentication, TokenAuthentication]
    permission_classes = [IsAuthenticated]  

    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    ordering_fields = ['apply_date','number_of_days','status']
    search_fields = ['status']
    filter_fields = ['status']

    def get(self, request, format=None):
        employee = request.user
        queryset = LeaveApplicationModel.objects.filter(employee_id=employee.id)
        
        # 手动应用过滤、搜索、排序
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(request, queryset, self)
        
        serializer = LeaveApplicationsListSerializer(queryset, many=True)
        return Response(data=serializer.data)

验证

修改后,你可以通过请求参数测试功能:

  • 过滤:?status=approved(根据你的status字段实际值调整)
  • 搜索:?search=approved
  • 排序:?ordering=-apply_date(负号表示降序)

内容的提问来源于stack exchange,提问作者Jerin Raju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:01:51