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

Django DRF基于非ID字段contrato批量删除返回405错误如何解决

报错原因

DRF 自带的 ModelViewSet 默认仅为详情端点(格式为 /alugueis/<主键id>/)绑定了 DELETE 请求的处理逻辑,列表端点(/alugueis/)默认不支持 DELETE 方法,因此直接向列表端点发送 DELETE 请求会返回 405 状态码。

代码调整方案

第一步:修改 ViewSet 增加批量删除逻辑

在你的 AlugueisViewSet 中增加批量删除的处理方法,同时可以复用你已经配置好的过滤规则,直接根据请求参数中的 contrato 字段过滤待删除的记录:

from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status

class AlugueisViewSet(viewsets.ModelViewSet):
    filter_backends = (filters.SearchFilter,DjangoFilterBackend)
    queryset = Alugueis.objects.all()
    serializer_class = AlugueisSerializer    
    filterset_fields = {           
        'contrato':['exact']            
    }

    # 新增批量删除方法,detail=False表示绑定到列表路由
    @action(methods=['delete'], detail=False)
    def bulk_delete(self, request):
        # 复用现有过滤规则筛选符合条件的记录
        filtered_queryset = self.filter_queryset(self.get_queryset())
        # 执行删除,返回删除的记录数
        deleted_count, _ = filtered_queryset.delete()
        return Response(
            data={"deleted_records": deleted_count},
            status=status.HTTP_204_NO_CONTENT
        )

第二步:路由配置(二选一)

方案A:使用默认action路由

无需额外修改路由配置,请求URL调整为:
DELETE http://127.0.0.1:8000/alugueis/bulk_delete/?contrato=174

方案B:保留原请求URL

如果你不想修改请求的URL路径,需要在路由注册时额外为列表端点绑定DELETE方法:

# 你的路由文件,比如urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import AlugueisViewSet

router = DefaultRouter()
router.register(r'alugueis', AlugueisViewSet, basename='alugueis')

urlpatterns = [
    # 额外添加列表端点的DELETE方法绑定
    path('alugueis/', AlugueisViewSet.as_view({'delete': 'bulk_delete'}), name='alugueis-bulk-delete'),
    path('', include(router.urls)),
]

配置完成后,你原来的请求 DELETE http://127.0.0.1:8000/alugueis/?contrato=174 就可以正常执行批量删除。

注意事项
  • 如果你的项目配置了权限校验,需要确保当前请求用户拥有对应记录的删除权限
  • 可以根据业务需要增加参数校验逻辑,避免空条件删除全表数据

内容的提问来源于stack exchange,提问作者Alessandro Barros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:51:03