之前路由的写法
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', BookView.as_view()),
path('books/<int:pk>', BookDetailView.as_view()),
]
继承ViewSetMixin后的写法
urlpatterns = [
path('admin/', admin.site.urls),
path('publish/', PublishView.as_view({'get':'list', 'post':'create'})),
]
这样写起来,做映射可能有些麻烦。于是DRF帮我们封装了两个路由类--->帮我们快速生成我们之前写的映射关系
SimpleRouter
- 第一步:导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter - 第二步:实例化得到对象
router = SimpleRouter() - 第三步:自动生成路由,调用对象的某个方法,完成视图类的额对应关系,映射路由
router.register('publish', PublishView, 'publish') - 第四步:把自动生成的路由添加进总路由中去
自动生成路由,自动映射如下:
{'get':'list', 'post':'create'}
{'get':'retrieve', 'put':'update', 'delete':'destroy'}
其他的视图类中,有别的方法,我们想做映射,我们需要使用装饰器
action 装饰器
作用: 为视图类中的方法做路径的映射
排除原有的:create, list, delete, retrieve, update
使用方式如上方代码块。自动生成部分
from rest_framework.decorators import action
class UserView(GenericViewSet):
@action(methods=['POST'], detail=False, url_path='register')
def register(self, request):
self.get_queryset()
return Response('register')
action的参数:
method:是请求方式
detail:是否带ID
url_path:URL路径名称
总结
大前提:必须是在使用ViewSetMixin + APIView 以及其子类的时候才能自动生成路由
'''使用步骤'''
# urls.py中
'''1 导入路由类'''
from rest_framework.routers import SimpleRouter, DefaultRouter
'''2 类实例化得到对象'''
router = SimpleRouter()
'''3 自动生成路由,调用对象的某个方法,完成跟视图类的对应关系,映射路由'''
router.register('publish', PublishView, 'publish')
# router.register('books', BookView, 'books') # 后期可以注册更多
router.register('user',UserView,'user')
'''4 把自动生成的路由,加到总路由中'''
urlpatterns = urlpatterns + router.urls # 两个列表直接相加
'''第四步可以这样写'''
path('api/v1/', include(router.urls)), # http://127.0.0.1:8008/api/v1/user/register/--->post