• DRF最高封装的子类视图


    # 转载请留言联系

    • 子类视图:

    视图作用方法父类
    ListAPIView 查询多条数据 get GenericAPIView
    ListModelMixin
    CreateAPIView 新增一条数据 post GenericAPIView
    CreateModelMixin
    RetrieveAPIView 查询一条数据 get GenericAPIView
    RetrieveModelMixin
    UpdateAPIView 修改一条数据 put,patch GenericAPIView
    UpdateModelMixin
    DestroyAPIView 删除一条数据 delete GenericAPIView
    DestroyModelMixin
    RetrieveUpdateAPIView 查询,更新一条数据 get,put,patch GenericAPIView
    RetrieveModelMixin UpdateModelMixin
    RetrieveUpdateDestroyAPIView 获取,更新,删除一条数据 get,put,patch,delete GenericAPIView
    RetrieveModelMixin UpdateModelMixin DestroyModelMixin
    • 对比以及使用(GenericAPIView+五个拓展类 VS 子类视图)

    1.GenericAPIView+五个拓展类

    class DepartmentListAPIView(ListModelMixin,CreateModelMixin,GenericAPIView):
    
        queryset = Department.objects.all()
        serializer_class = DepartmentSerializer
    
        def get(self,request):
            """查询多条数据"""
            return self.list(request)
    
        def post(self,request):
            """新增一条数据"""
            return self.create(request)
    
    class DepartmentDetailAPIView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
    
        queryset = Department.objects.all()
        serializer_class = DepartmentSerializer
    
        def get(self,request,pk):
            """查询一条数据"""
            return self.retrieve(request,pk)
    
        def post(self,request,pk):
            """修改部门"""
            return self.update(request,pk)
    
        def delete(self,request,pk):
            """删除一个部门"""
            return self.destroy(request,pk)

    2.子类视图

    class DepartmentListAPIView(ListAPIView,CreateAPIView):
        ”“”实现了查询多条数据和新增一条数据的功能"""
        queryset = Department.objects.all()
        serializer_class = DepartmentSerializer
    
    
    class DepartmentDetailAPIView(RetrieveUpdateDestroyAPIView):
        """实现了查询一条数据、修改一条数据、删除一条数据的功能"""
        queryset = Department.objects.all()
        serializer_class = DepartmentSerializer

     3.子类视图的源码分析

    # Concrete view classes that provide method handlers
    # by composing the mixin classes with the base view.
    
    class CreateAPIView(mixins.CreateModelMixin,
                        GenericAPIView):
        """
        Concrete view for creating a model instance.
        """
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
    
    class ListAPIView(mixins.ListModelMixin,
                      GenericAPIView):
        """
        Concrete view for listing a queryset.
        """
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
    
    class RetrieveAPIView(mixins.RetrieveModelMixin,
                          GenericAPIView):
        """
        Concrete view for retrieving a model instance.
        """
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
    
    class DestroyAPIView(mixins.DestroyModelMixin,
                         GenericAPIView):
        """
        Concrete view for deleting a model instance.
        """
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
    
    
    class UpdateAPIView(mixins.UpdateModelMixin,
                        GenericAPIView):
        """
        Concrete view for updating a model instance.
        """
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def patch(self, request, *args, **kwargs):
            return self.partial_update(request, *args, **kwargs)
    
    
    class ListCreateAPIView(mixins.ListModelMixin,
                            mixins.CreateModelMixin,
                            GenericAPIView):
        """
        Concrete view for listing a queryset or creating a model instance.
        """
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
    
    class RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                GenericAPIView):
        """
        Concrete view for retrieving, updating a model instance.
        """
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def patch(self, request, *args, **kwargs):
            return self.partial_update(request, *args, **kwargs)
    
    
    class RetrieveDestroyAPIView(mixins.RetrieveModelMixin,
                                 mixins.DestroyModelMixin,
                                 GenericAPIView):
        """
        Concrete view for retrieving or deleting a model instance.
        """
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
    
    
    class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
                                       mixins.UpdateModelMixin,
                                       mixins.DestroyModelMixin,
                                       GenericAPIView):
        """
        Concrete view for retrieving, updating or deleting a model instance.
        """
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def patch(self, request, *args, **kwargs):
            return self.partial_update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)

    实际上就是把(GenericAPIView+五个拓展类)的函数封装一下,return回去而已......

  • 相关阅读:
    es5中的类 继承 (原型链继承,寄生继承,组合继承)
    typeScript类型
    javaScript 不可思议问题
    javaScript 运算符(操作符)
    window.a 与 window[a]区别
    Event Loop事件循环
    生产环境vue-router模式为history导致页面404
    Axios请求添加token
    vue页面利用keep-alive实现页面快速缓存
    js原型链原理
  • 原文地址:https://www.cnblogs.com/chichung/p/9941579.html
Copyright © 2020-2023  润新知