在DRF中同时用DefaultRouter注册APIView与ModelViewSet的方法
解答:Django REST中同时使用ModelViewSet和APIView的路由配置
嘿,恭喜你发布了第一个Stack Overflow问题!作为Django REST框架的新手,遇到这类视图路由的困惑太正常了,我来帮你梳理清楚~
首先直接给你结论:完全可以同时使用ModelViewSet和APIView,只是它们的路由配置方式不一样,你不需要把已经写好的UniquePostViewSet改成APIView,两种视图可以完美共存。
为什么直接用router.register注册APIView会报错?
你遇到的AttributeError: type object 'FileUploadView' has no attribute 'get_extra_actions',原因是DefaultRouter是专门为**视图集(ViewSet)**设计的。视图集类(比如ModelViewSet)内置了get_extra_actions这类方法,用来自动生成CRUD对应的路由规则;而APIView是最基础的视图类,没有这些视图集特有的方法,所以直接用router.register注册肯定会报错。
正确的配置方式
我们可以保留ModelViewSet的自动路由生成,同时手动为APIView添加路由,具体代码如下:
修改后的urls.py
from post.api.views import UniquePostViewSet, FileUploadView from django.urls import path, include from rest_framework.routers import DefaultRouter # 为ModelViewSet注册自动路由 router = DefaultRouter() router.register('UniquePost', UniquePostViewSet, base_name='uniquepostitem') # 合并路由:把自动生成的路由和手动配置的APIView路由放在一起 urlpatterns = [ path('', include(router.urls)), # 手动为APIView添加路由,必须调用.as_view()方法 path('demo/', FileUploadView.as_view(), name='file-upload-demo'), ]
这样配置后:
UniquePostViewSet依然会自动生成/UniquePost/(列表、创建)、/UniquePost/<pk>/(详情、更新、删除)等标准CRUD路由;FileUploadView会对应到/demo/路由,完全按照你在APIView里定义的post等方法处理请求。
额外小建议
- 如果你觉得手动加路由麻烦,也可以把
FileUploadView改成GenericViewSet或者ViewSet,但对于文件上传这种不需要和数据库模型绑定的简单接口,直接用APIView+手动路由反而更简洁,没必要多此一举; ModelViewSet适合快速实现和数据库模型关联的标准CRUD接口,而APIView适合需要自定义业务逻辑的场景(比如文件上传、第三方接口调用等),两者各司其职,搭配使用非常灵活。
内容的提问来源于stack exchange,提问作者ritchbeau
相关产品推荐
相关产品推荐

