【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):
相关文章
|
28天前
|
开发者 数据库管理 Python
Django框架和Flask框架的区别
总体而言,Django 适合需要快速搭建大型应用的开发者,而 Flask 则更适合有特定需求和追求灵活性的开发者。
113 64
|
2月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
100 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
2月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
24 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
87 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
3月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
4月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
86 0
|
4月前
|
Python
列出 Django 中的继承样式
【8月更文挑战第30天】
34 0
|
4月前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
171 45
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
59 2