现状
最近的项目是用DRF框架实现后端的接口,视图果断使用modelviewset,而DRF默认的两个路由生成类routers.SimpleRouter和DefaultRouter,都会默认生成CURD七个接口的路由,项目不需要这些路由,所以决定自己实现一下Router,很简单,继承SimpleRouter重写类属性routes即可
代码
from rest_framework import routers
class CustomRouter(routers.SimpleRouter):
"""
自定义的动态路由生成类,用于动态生成viewset中detail=False的接口路由,且不生成DRF原生CURD接口默认生成的路由和detail=True的路由
配合DRF的ModelViewSet实现CBV的接口
"""
routes = [
# Dynamically generated list routes. Generated using
# @action(detail=False) decorator on methods of the viewset.
routers.DynamicRoute(
url=r'^{prefix}/{url_path}{trailing_slash}$',
name='{basename}-{url_name}',
detail=False,
initkwargs={}
),
]
调用
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
class TestViewSet(ModelViewSet):
@action(methods=['post'], detial=False)
def dev(self, request, *args, **kwargs):
pass
@action(methods=['get'], detial=False, url_path='test')
def testing(self, request, *args, **kwargs):
pass
# urls.py # 如下配置,只生成test_view/dev 和test_view/test 两个路由
router = CustomRouter()
router.register(r'test_view', TestViewSet, basename='test_view')
urlpatterns = [] + router.urls