DRF | 第六天 路由

67 阅读1分钟

之前路由的写法

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

  1. 第一步:导入路由类from rest_framework.routers import SimpleRouter, DefaultRouter
  2. 第二步:实例化得到对象router = SimpleRouter()
  3. 第三步:自动生成路由,调用对象的某个方法,完成视图类的额对应关系,映射路由router.register('publish', PublishView, 'publish')
  4. 第四步:把自动生成的路由添加进总路由中去

自动生成路由,自动映射如下:

{'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