zoukankan      html  css  js  c++  java
  • drf之路由组件

    drf之路由组件

    快速配置

    在上篇博客之前,我们都是手写路由,去配置url

    # 普通写法
    path('books4/', views.Book4View.as_view()),
    re_path('books4/(?P<pk>d+)', views.Book4DetailView.as_view()),
    
    # 继承了ViewSetMixin,要加上action
    path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})),
    # 当路径匹配,又是get请求,会执行Book5View的list方法
    re_path('books5/(?P<pk>d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
    

    drf中提供了自动生成路由的方法

    1. 导入routers模块,有两个类,SimpleRouter和DefaultRouter
    2. 实例化类得到对象
    3. 注册
    4. router.urls中得到自动生成的路由(列表形式)
    5. 把生成的路由列表加到urlpaterns里
    # urls.py
    from app01 import views
    from rest_framework import routers
    # 导入router模块
    router = routers.SimpleRouter()
    # 使用routers模块之一,简单路由
    router.register('books',views.BookViewSet)
    # 注册,第一个参数填url的后缀,相当于urlpatterns里的正则匹配,第二个参数写触发的试图类(继承了ModelViewSet)
    # router.url会生成一个列表,里面是两条url
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]
    urlpatterns += router.urls
    # router.url与urlpatterns拼接,就可以访问到url了
    
    # views.py
    class BookViewSet(ModelViewSet):
        # 需要继承这个类,才能自动生成路由
        queryset = models.Book.objects
        serializer_class = ser.BookSerializer
    

    除了SimpleRouter,还有DefaultRouter,生成的列表中会多出来4个url,还支持用有名分组format接收类似.html,.json这种后缀

    action的使用

    自动生成路由后,我们原本在写APIView时候,视图中的get,post这些方法,彻底封装进去了。如果需要使用这些以外的视图函数,也可以用action做一些扩展

    1. rest_framework.decorators import action

    2. 在继承了ModelViewSet的视图类中,需要加上路由的视图函数上面写装饰器

      @action(method=[’GET’,],detail=False)

    3. detail=False表示生成不带pk的地址,=True则会生成一个有名分组,接收一个pk值

    class BookViewSet(ModelViewSet):
    # 需要继承ModelViewSet
        queryset = models.Book.objects
        serializer_class = ser.BookSerializer
    
        @action(methods=['GET'],detail=False)
        # method里面方法大写小写都可以识别
        # 如果detail是True,要多写一个形参接收pk值
        # 别的写法和普通GenericAPIView一样,要手动返回Response
        def bookAction(self,request):
            return Response({'msg':'action'})
    

    这里可以看到,已经新加了一个ur,其中url的后缀就是视图函数的函数名

    总结一下

    drf提供的一个装饰器,放在被装饰的视图函数上方,method是请求方式,detail指定是否带pk参数,视图函数的函数名作为url的后缀。我们可以用action来给自定义视图函数自动生成路由

    视图继承关系

    以下是一些视图的继承关系

    #两个基类
    APIView
    GenericAPIView:有关数据库操作,queryset 和serializer_class
    
    
    #5个视图扩展类(rest_framework.mixins)
    CreateModelMixin:create方法创建一条
    DestroyModelMixin:destory方法删除一条
    ListModelMixin:list方法获取所有
    RetrieveModelMixin:retrieve获取一条
    UpdateModelMixin:update修改一条
    
    #9个子类视图(rest_framework.generics)
    CreateAPIView:继承CreateModelMixin,GenericAPIView,有post方法,新增数据
    DestroyAPIView:继承DestroyModelMixin,GenericAPIView,有delete方法,删除数据
    ListAPIView:继承ListModelMixin,GenericAPIView,有get方法获取所有
    UpdateAPIView:继承UpdateModelMixin,GenericAPIView,有put和patch方法,修改数据
    RetrieveAPIView:继承RetrieveModelMixin,GenericAPIView,有get方法,获取一条
    
    
    ListCreateAPIView:继承ListModelMixin,CreateModelMixin,GenericAPIView,有get获取所有,post方法新增
    RetrieveDestroyAPIView:继承RetrieveModelMixin,DestroyModelMixin,GenericAPIView,有get方法获取一条,delete方法删除
    RetrieveUpdateAPIView:继承RetrieveModelMixin,UpdateModelMixin,GenericAPIView,有get获取一条,put,patch修改
    RetrieveUpdateDestroyAPIView:继承RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView,有get获取一条,put,patch修改,delete删除
    
    #视图集
    ViewSetMixin:重写了as_view 
    ViewSet:     继承ViewSetMixin和APIView
    
    GenericViewSet:继承ViewSetMixin, generics.GenericAPIView
    ModelViewSet:继承mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
    ReadOnlyModelViewSet:继承mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet
    
  • 相关阅读:
    在Activity/Fragment以外使用Toast【转】
    Android笔记(四十七) Android中的数据存储——XML(三)SAX解析
    Android笔记(四十六) Android中的数据存储——XML(二)PULL解析
    Python的包(Packages)
    编写你自己的Python模块
    了解Python控制流语句——continue 语句
    了解Python控制流语句——break 语句
    了解Python控制流语句——for 循环
    了解Python控制流语句——while 语句
    了解Python控制流语句——if语句
  • 原文地址:https://www.cnblogs.com/telecasterfanclub/p/13274963.html
Copyright © 2011-2022 走看看