Drf视图集合

1.背景:

       技术储备,drf适合前后端分离项目,比较适合单表操作的业务,另外丰富的视图集合配合路由自动生成,开发速度能得到极大的提升。

 

2、视图分类:

         2.1:视图超类:         

                    from rest_framework.views import APIView     

                   from rest_framework.generics import GenericAPIView

               

APIView 继承与原生的Django的view,重写了as_view 和 dispatch方法
GenericAPIView 继承与APIView,提供了三个属性(queryset、serializer_class、lookup_field)以及三个方法(get_queryset、get_serializer、get_obj)

 

         2.2:视图工具类(mixin):

                 此工具类需要配合 GenericAPIView 不能单独使用,需要在视图中重写 get、post等方法

                 from rest_framework import mixins

CreateModelMixin 单增工具类——实现create方法
ListModelMixin 群查工具类——实现list方法
RetrieveModelMixin 单查工具类——实现retrieve方法
UpdateModelMixin 单整体局部改工具类——实现update方法
DestoryModelMixin 单删工具类——实现destory方法

        

 

        2.3:工具视图类(generics):

                其实继承与 GenericAPIView、 mixin(子类),由于mixin的子类不能单独使用,需要配合 GenericAPIView,等于是GenericAPIView任意组合了mixin子类,并且重写了实现方法(可能一对一,可能一对多),共9个

序号
类名
备注
1
CreateAPIView
创建数据,对应post,只实现了CreateModelMixin.create方法
2
ListAPIView
查询全部数据,对应get,只实现了ListModelMixin.list方法
3
DestroyAPIView
删除数据,对应delete,只实现了DestoryModelMixin.destory 方法
4
UpdateAPIView
更新数据,对应put,只是实现了 UpdateModelMixin.update 方法
5
RetrieveAPIView
查询单条数据,对应get,只是实现了RetrieveModelMixin.retrieve 方法
6
RetrieveUpdateAPIView
对应 get、put,实现了 4--5
7
ListCreateAPIView
对应 get、post,实现了 1--2
8
RetrieveDestroyAPIView
对应 get、delete,实现了 5--3
9
RetrieveUpdateDestroyAPIView
对应 get、delete,put ,实现了 5--3--4

 

          2.4:视图集合 

                   from rest_framework.views import ModelViewSet

                   ModelViewSet    视图大集合 实际上继承了mixins 以及 GenericViewSet ,GenericViewSet不等于 GenericAPIView,GenericViewSet实际继承了 ViewSetMixin 然后这个类重写了as_view方法,直接或者间接继承ViewSetMixin必须指定action 例如as_VIEW({"get":"get_all"})

class ActionModeViewSetDemo(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

    # detail 只有 true 和false 2种 detail =True 则生成路径中带 pk 的 否则生成正常的
    # 在路由中生成 并且 detail是false
    #     ^booksaction/get_all/$ [name='booksviewset-get-all']
    #     ^booksaction/get_all\.(?P<format>[a-z0-9]+)/?$ [name='booksviewset-get-all']

    @action(methods=["get","post"],detail=False)
    def get_all(self,request):
        book = self.get_queryset()[:2]
        ser = self.get_serializer(book,many=True)
        return Response({"code":100,"msg":"success","result":ser.data})


    # detail = True 则生成带pk的
    # booksaction/(?P<pk>[^/.]+)/get_b/$ [name='booksaction-get-b']
    @action(methods=["get"],detail=True)
    def get_b(self,request,pk):
        book = self.get_queryset()
        ser = self.get_serializer(book,many=True)
        if int(pk) > 0:
            return Response({"code": 100, "msg": "success", "result": ser.data})

  路由配置

router = routers.DefaultRouter()
router.register('booksaction',ap01view.ActionModeViewSetDemo)

  

3、路由:

       drf 框架中 提供了2种路由    DefaultRouter、SimpleRouter,区别就是DefaultRouter 会生成更多的路由,并且会生成根路由,SimpleRouter 只有 2种 

       注(生成的路由并不等于需要被调用的方法 get、post等)

       SimpleRouter 

       

 

         

 

 

        DefaultRouter:

 

 

 

                            

 
posted @ 2022-08-28 14:47  Yuan_x  阅读(37)  评论(0编辑  收藏  举报