如何用Django REST Framework的Routers重写现有API代码?
使用DRF Routers重写代码的方案
DRF默认的DefaultRouter/SimpleRouter的register方法生成的是标准RESTful路由,其中删除动作是针对单条资源的DELETE /users/{pk},而非你需要的集合级DELETE /users/。要实现你的需求,有两种可行思路:
思路1:Router+手动补充自定义路由
先用Router处理标准的GET /users/和POST /users/,再手动添加你需要的特殊路由:
from rest_framework.routers import DefaultRouter router = DefaultRouter() # 注册后自动生成GET /users/、POST /users/、GET /users/{pk}/、PUT/PATCH /users/{pk}/、DELETE /users/{pk} router.register(r'users', UserViewSet, basename='user') urlpatterns = [ path('admin/', admin.site.urls), # 手动添加集合级删除路由 path('users/', UserViewSet.as_view({'delete': 'delete'})), # 手动添加用户视频操作路由 path('users/<uuid:pk>/video/', UserViewSet.as_view({'post': 'video'})), ] + router.urls
注:HTTP方法不同,手动添加的DELETE /users/不会和Router生成的GET/POST /users/冲突。
思路2:在ViewSet中用@action定义自定义动作
把特殊路由对应的逻辑封装到ViewSet的自定义动作里,让Router自动生成路由:
首先修改UserViewSet:
from rest_framework.decorators import action from rest_framework import status from rest_framework.response import Response class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer # 集合级删除动作:detail=False对应/users/路径 @action(detail=False, methods=['delete'], url_path='') def bulk_delete(self, request): # 替换为你的批量删除逻辑 User.objects.all().delete() return Response(status=status.HTTP_204_NO_CONTENT) # 单用户视频操作:detail=True对应/users/{pk}/路径 @action(detail=True, methods=['post'], url_path='video') def handle_user_video(self, request, pk=None): user = self.get_object() # 替换为你的视频处理逻辑 return Response(status=status.HTTP_200_OK)
然后注册Router即可,无需手动添加video相关路由:
router = DefaultRouter() router.register(r'users', UserViewSet, basename='user') urlpatterns = [ path('admin/', admin.site.urls), ] + router.urls
注:建议把批量删除的方法名改为bulk_delete而非delete,避免和ModelViewSet默认的单资源删除方法destroy混淆。
关于路由方式的选择
如果你的路由需求仅此而已,没有后续扩展更多RESTful动作的计划,直接用原来的as_view({...})字典写法反而更简洁,不需要引入Router的额外复杂度。
但如果后续需要给User资源添加更多标准操作(比如PUT/PATCH用户信息)或自定义动作,用Router结合@action的方式会更便于维护——它能自动管理路由规则,避免手动编写大量重复的path配置。
总结:
- 需求简单无扩展:保留原字典方式更合适
- 需扩展更多动作:Router方案更高效
内容的提问来源于stack exchange,提问作者Anonymous Wizard
相关产品推荐
相关产品推荐

