【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):
相关文章
|
2月前
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
48 2
|
2月前
|
JSON 数据处理 API
Django后端架构开发:视图与模板的正确使用
Django后端架构开发:视图与模板的正确使用
15 1
|
25天前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
2月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
17 0
|
2月前
|
Python
列出 Django 中的继承样式
【8月更文挑战第30天】
29 0
|
2月前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
2月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
Django 如何使用视图动态输出 CSV 以及 PDF
43 4
|
3月前
|
API 数据库 数据安全/隐私保护
Django配置api、管理系统和视图
Django配置api、管理系统和视图
72 1
|
2月前
|
测试技术 Shell 数据库
Django视图测试:构建可靠Web应用的关键步骤
Django视图测试:构建可靠Web应用的关键步骤
22 0
|
4月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
这一篇我们需要用到 python 的 csv 和 reportLab 库,通过django视图来定义输出我们需要的 csv 或者 pdf 文件。