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
相关产品推荐
相关产品推荐

