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

如何在Django Rest Framework中实现按ID批量删除功能

Django Rest Framework 按ID批量删除功能实现

问题根源

你自定义的批量删除action未生效,核心问题有两点:

  1. 你通过request.data获取ids,但实际请求是通过URL查询参数传递该值,应从request.query_params提取
  2. 查询参数中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:47:49