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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:30:37