如何在Django Rest Framework中实现按ID批量删除功能
Django Rest Framework 按ID批量删除功能实现
问题根源
你自定义的批量删除action未生效,核心问题有两点:
- 你通过
request.data获取ids,但实际请求是通过URL查询参数传递该值,应从request.query_params提取 - 查询参数中的
ids是逗号分隔的字符串,未转换为整数列表,无法用于id__in查询
修正后的完整代码
更新AssignmentViewSet中的批量删除方法:
from rest_framework import status from rest_framework.response import Response from rest_framework.decorators import action class AssignmentViewSet(viewsets.ModelViewSet): """View for manage assignment APIs.""" serializer_class = serializers.AssignmentSerializer queryset = Assignment.objects.all() # 修正拼写:Assgnment → Assignment authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated] def get_queryset(self): """Retrieve assignments for authenticated user.""" return self.queryset.filter(user=self.request.user).order_by('-id') def get_serializer_class(self): """Return the serializer class for request.""" if self.action == 'list': return serializers.AssignmentSerializer return self.serializer_class def perform_create(self, serializer): """Create an Assignment.""" serializer.save(user=self.request.user) @action(detail=False, methods=['delete']) def delete_bulk(self, request): """Delete multiple assignments by IDs.""" # 从URL查询参数获取ID字符串 ids_str = request.query_params.get('ids', '') # 转换为整数列表,过滤无效值 assignment_ids = [] for id_item in ids_str.split(','): stripped_id = id_item.strip() if stripped_id.isdigit(): assignment_ids.append(int(stripped_id)) if not assignment_ids: return Response({"error": "请提供有效的ID列表"}, status=status.HTTP_400_BAD_REQUEST) # 使用get_queryset确保只操作当前用户的资源 deleted_count, _ = self.get_queryset().filter(id__in=assignment_ids).delete() if deleted_count == 0: return Response({"error": "未找到可删除的任务"}, status=status.HTTP_404_NOT_FOUND) return Response({"message": f"成功删除{deleted_count}个任务"}, status=status.HTTP_200_OK)
关键修正说明
- 参数获取:用
request.query_params替代request.data,匹配你通过URL传递参数的方式 - 格式转换:将逗号分隔的字符串转为整数列表,避免查询时类型不匹配
- 安全校验:通过
get_queryset()获取用户专属数据,防止越权删除其他用户的任务 - 响应优化:增加错误场景的明确提示,便于调试和前端处理
测试请求
你的curl请求无需修改,直接使用即可:
curl -X 'DELETE' \ 'http://127.0.0.1:8000/api/assignment/assignment/delete_bulk?ids=8,9' \ -H 'accept: */*' \ -H 'Authorization: Token 1376bfc2439f1347ab16b28fb9e83b83a4336984' \ -H 'X-CSRFTOKEN: x5CfIVresmUTbpG5GlPKAthmZ26WrWv3R5W0etOuhMm5Tbs0skwJMhxDFsT1KxKB'
额外提示
- 修正模型类拼写:原代码中
Assgnment应为Assignment,否则会触发数据库查询错误 - 批量操作限制:若需删除大量ID,建议分批执行,避免长时间占用数据库连接
内容的提问来源于stack exchange,提问作者Vivek Kumar
相关产品推荐
相关产品推荐

