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

