【Django学习】(十三)Mixins_各种具体通用类&APIView_ViewSet_GenericViewSet_ModelViewSet类视图继承的父类区别(下)

简介: 【Django学习】(十三)Mixins_各种具体通用类&APIView_ViewSet_GenericViewSet_ModelViewSet类视图继承的父类区别(下)

四、类视图继承的父类区别

1、继承APIView

  1. 如果两个类视图合并,会出现两个get方法会冲突的问题
  2. 如果使用Mixin中提供的拓展方法(action动作),当前DRF是无法识别这些action
  3. class ProjectViewSet(APIView):

2、继承ViewSet视图集

  1. 两个类视图可以合并,尤其是有2个get方法的类视图
  2. 支持这些action,并在定义url路由时,可以在as_view({"请求方法名": "action名称"})
  1. 例如as_view({'get':'retrieve','put':'update','delete':'destroy','patch':'partial_update'})
  2. as_view({'get':'list','post':'create',})
  1. 继承ViewSetMixin()(ViewSetMixin提供的能力,改写as_view(),以便它接受' actions '关键字来执行将HTTP方法绑定到资源上的操作。),views.APIView
  1. 需要自定义action
  2. 并且不支持分页、过滤、排序功能
  1. class ProjectViewSet(viewsets.ViewSet):

class ProjectsViewSet(viewsets.ViewSet):
    # 指定当前类视图需要使用的查询集
    queryset = ProjectsModel.objects.all()
    # 指定当前类视图需要使用的序列化器类
    serializer_class = ProjectModelSerializer
    # lookup_field = 'Id'
    # 声明需要使用的引擎类
    filter_backends = [filters.SearchFilter,
                       filters.OrderingFilter
                       ]
    # 定义需要过滤的字段
    search_fields = ['name', 'id']
    # 定义需要排序的字段
    ordering_fields = ['id', 'name']
    # 声明需要使用的分页引擎
    pagination_class = PageNumberPagination
    def retrieve(self, request, *args, **kwargs):
        # 需要自定义action    
        pass
    def list(self, request, *args, **kwargs):
        pass
    def put(self, request, *args, **kwargs):
        pass
    def destroy(self, request, *args, **kwargs):
        pass
    def create(self, request, *args, **kwargs):
        pass
    def partial_update(self, request, *args, **kwargs):
        pass

3、继承GenericViewSet通用视图集

  1. 两个类视图可以合并,尤其是有2个get方法的类视图
  2. 继承 ViewSetMixin, generics.GenericAPIView
  1. ViewSetMixin提供了路由识别action的能力
  1. 支持分页、过滤、排序功能(因为有继承generics.GenericAPIView)
  2. 可以先声明queryset、serializer_class
  3. 未提供action方法
  4. class ProjectViewSet(viewsets.GenericViewSet):

class ProjectsViewSet(
    mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    mixins.ListModelMixin,
    mixins.CreateModelMixin,
    viewsets.GenericViewSet):
    # 指定当前类视图需要使用的查询集
    queryset = ProjectsModel.objects.all()
    # 指定当前类视图需要使用的序列化器类
    serializer_class = ProjectModelSerializer
    # lookup_field = 'Id'
    # 声明需要使用的引擎类
    filter_backends = [filters.SearchFilter,
                       filters.OrderingFilter
                       ]
    # 定义需要过滤的字段
    search_fields = ['name', 'id']
    # 定义需要排序的字段
    ordering_fields = ['id', 'name']
    # 声明需要使用的分页引擎
    pagination_class = PageNumberPagination
    # 因为继承了mixins里的各种action方法,所以自定义的action就可以不用写了
    # 如果请求方法为get -> retrieve方法
    # def retrieve(self, request, *args, **kwargs):
    #     pass
    # 如果请求方法为get -> list方法
    # def list(self, request, *args, **kwargs):
    #     pass
    #
    # def update(self, request, *args, **kwargs):
    #     pass
    #
    # def destroy(self, request, *args, **kwargs):
    #     pass
    #
    # def create(self, request, *args, **kwargs):
    #     pass
    #
    # def partial_update(self, request, *args, **kwargs):
    #     pass

🔼因为继承了mixins里的各种action方法,所以自定义的action就可以不用写了(上面被注释的代码!)

上面继承了太多的 mixins,我们可以找个全部继承了这些类的子类 来继承,这就是ModelViewSet模型视图集类

最后可以简化为:

class ProjectsViewSet(viewsets.ModelViewSet):
相关文章
|
4月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
39 1
|
1月前
|
缓存 中间件 API
使用 Django 的异步特性提升 I/O 类操作的性能
使用 Django 的异步特性提升 I/O 类操作的性能
42 0
|
3月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
21 0
Python 教程之 Django(6)视图类型
|
3月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
28 1
Python 教程之 Django(5)视图基础
|
3月前
|
缓存 开发者 Python
Django 视图层
Django 视图层
47 0
|
4月前
|
调度 Apache 数据库
Django 学习教程-第一个 Django 应用
本章主要讲述了如何创建一个Django项目,以一个投票案例程序介绍了Django的请求和响应流程。
51 1
|
4月前
|
Python
Django 学习教程-介绍与安装
本章介绍了Django是什么,以及为什么使用Django和安装Django
40 1
Django 学习教程-介绍与安装
|
4月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
35 0
|
4月前
|
Shell 数据库 Python
删除视图——基于函数的视图 Django
删除视图——基于函数的视图 Django
22 0
|
4月前
|
Shell 数据库 Python
更新视图——基于函数的视图 Django
更新视图——基于函数的视图 Django
24 0