Django REST Framework如何实现DELETE请求删除数据库指定用户
当前删除接口无法生效的核心原因
你现在用的RetrieveUsersView继承自generics.ListCreateAPIView,这个类的设计定位就是处理用户集合层面的请求:
- 仅能响应无路径参数的
/all_users/请求,提供全量用户列表查询、创建用户的能力 - 本身没有定义单条资源的处理逻辑,也不内置DELETE请求的处理方法
- 现有路由里也没有配置带用户ID参数的匹配规则,哪怕你手动输入
/all_users/1的地址,请求也无法被正确路由到处理逻辑上。
可落地的实现方案
1. 新增支持单用户操作的泛型视图
不需要手写删除逻辑,DRF的generics.RetrieveUpdateDestroyAPIView已经内置了完整的单资源处理能力,天生支持DELETE请求触发数据库删除操作:
class UserDetailView(generics.RetrieveUpdateDestroyAPIView): """处理单条用户记录的查询、修改、删除""" serializer_class = UserSerializer authentication_classes = (authentication.TokenAuthentication,) permission_classes = (permissions.IsAdminUser,) queryset = get_user_model().objects.all()
这个视图的内置逻辑会自动从路径参数中读取用户ID,匹配到数据库对应用户记录后,接收到DELETE请求时就会直接执行删除动作,不需要你额外写ORM查询、删除的代码。
注意:权限配置不能省略,否则任意登录用户都能通过DELETE请求删除其他账号,存在严重的安全隐患
2. 补充对应的路由规则
在现有路由列表中新增一条带用户ID参数的匹配规则,对应你预期的/api/users/all_users/1接口形式:
urlpatterns = [ path('create/', views.CreateUserView.as_view(), name='create'), path('token/', views.CreateTokenView.as_view(), name='token'), path('me/', views.ManageUserView.as_view(), name='me'), path('all_users/', views.RetrieveUsersView.as_view(), name='all_users'), # 新增路径:匹配带整数用户ID的单资源请求 path('all_users/<int:pk>/', views.UserDetailView.as_view(), name='user-detail') ]
Django路由匹配时会优先匹配精确路径,再匹配带参数的路径,两个同前缀的路径不会产生冲突。
3. 需要避开的常见问题
- 不要把删除逻辑硬塞到原来的
RetrieveUsersView里:会打破集合视图的设计边界,还要自己手动实现路径参数解析、单条记录定位,代码冗余度很高。 - 测试时注意路径末尾的斜杠:DRF默认会做斜杠的自动跳转,但手动测试的时候最好带上,避免出现404错误。
- 现有序列化器不需要修改:你写的
UserSerializer已经覆盖了单资源操作需要的字段映射,不需要为了删除功能额外改动。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

