八、(重点)视图集ModelViewSet自定义action路由routers

上一章:

七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值_做测试的喵酱的博客-CSDN博客

下一章:  

九、DRF生成API文档_做测试的喵酱的博客-CSDN博客

1、View

最基础的视图类View

2、views.APIView

class APIView(View):

3、generics.GenericAPIView

class GenericAPIView(views.APIView):

GenericAPIView有哪些方法和类属性?
1、类属性
    queryset、serializer_class

2、方法
get_queryset、get_serializer、get_serializer_class、filter_queryset、paginate_queryset、
get_paginated_response

4、GenericViewSet

1、继承关系,GenericViewSet 继承了

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):

2、大部分的自定义功能,通过重写GenericAPIView的方法和类属性实现

GenericAPIView有哪些方法和类属性?

a、类属性

queryset、serializer_class

queryset:查询集

serializer_class:序列化器

b、方法

get_queryset、get_serializer、get_serializer_class、filter_queryset、paginate_queryset、 get_paginated_response

get_queryset:获取查询集对象,默认获取类属性queryset 的值,我们也可以根据需要自定义做判断

get_serializer:获取序列化器对象,默认获取类属性serializer_class 的值,我们也可以根据需要自定义做判断

filter_queryset:过滤筛选查询集

paginate_queryset:分页处理查询集

get_paginated_response:response数据处理,改变response,可以重写get_paginated_response

5、 viewsets.ModelViewSet

1、作用:

# a.ModelViewSet是一个最完整的视图集类
# b.提供了获取列表数据接口、获取详情数据接口、创建数据接口、更新数据接口、删除数据的接口
# c.如果需要多某个模型进行增删改查操作,才会选择ModelViewSet
# d.如果仅仅只对某个模型进行数据读取操作(取列表数据接口、获取详情数据接口),一般会选择ReadOnlyModelViewSet

2、继承关系

viewsets.ModelViewSet 继承了

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):

一、视图集ModelViewSet与ReadOnlyViesSet

ModelViewSet视图集 与 ReadOnlyViesSet视图集

1、ModelViewSet视图集:支持增删改查,如果需要对某个模型进行增删改查操作,才会选择ModelViewSet

2、ReadOnlyViesSet视图集:只支持读取操作,如果仅仅只对某个模型进行数据读取操作(取列表数据接口、获取详情数据接口),一般会选择ReadOnlyModelViewSet。

二、视图集ModelViewSet

ModelViewSet是一个最完整的视图集类。

1、提供了获取列表数据接口、获取详情数据接口、创建数据接口、更新数据接口、删除数据的接口(增删改查接口)

2、如果需要对某个模型进行增删改查操作,才会选择ModelViewSet
3、如果仅仅只对某个模型进行数据读取操作(取列表数据接口、获取详情数据接口),一般会选择ReadOnlyModelViewSet

class ProjectViewSet(viewsets.ModelViewSet):
    """
    list:
    获取项目列表数据

    retrieve:
    获取项目详情数据

    update:
    更新项目信息

    names:
    获取项目名称

    """

    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer

    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['=name', '=leader', '=id']
    ordering_fields = ['id', 'name', 'leader']

    # 可以在类视图中指定分页引擎类,优先级高于全局
    pagination_class = PageNumberPagination

2.0 类视图的设计原则


 a.类视图尽量要简单
 b.根据需求选择相应的父类视图
 c.如果DRF中的类视图有提供相应的逻辑,那么就直接使用父类提供的
 d.如果DRF中的类视图,绝大多数逻辑都能满足需求,可以重写父类实现
 e.如果DRF中的类视图完全不满足要求,那么就直接自定义即可 

2.1 自定义视图集方法action

场景:当视图集默认提供的方法,不能满足需求时,可以自定义action方法。

    @action(methods=['GET'], detail=False)
    def names(self, request, *args, **kwargs):
        # queryset = self.get_queryset()
        # queryset = self.filter_queryset(queryset)
        # names_list = []
        # for project in queryset:
        #     names_list.append({
        #         'id': project.id,
        #         'name': project.name
        #     })
        # serializer = self.get_serializer(queryset, many=True)
        #
        # # return Response(names_list, status=200)
        # return Response(serializer.data, status=200)
        return super().list(request, *args, **kwargs)

2.1.1 函数定义

2.1.2 action装饰 

@action(methods=['GET'], detail=False, url_path='xxx', url_name='yyyy')

如果需要使用路由器机制自动生成路由条目,那么就必须得使用action装饰器
1、methods(非必填)指定需要使用的请求方法,如果不指定,默认为GET
2、detail(必填)指定是否为详情接口,是否需要传递当前模型的pk值
     如果需要传递当前模型的pk值,那么detail=True,否则detail=False
3、url_path指定url路径,默认为action方法名称
4、url_name指定url路由条目名称后缀,默认为action方法名称

127.0.0.1:8000/projects/names/

127.0.0.1:8000/projectsxxx/$[name='projects-yyy']

   @action(detail=True)
    def interfaces(self, request, *args, **kwargs):
        project = self.get_object()
        interfaces_qs = project.interfaces_set.all()
        interfaces_data = [{'id': interface.id, 'name': interface.name} for interface in interfaces_qs]
        return Response(interfaces_data, status=200)

127.0.0.1:8000/projects/12/interfaces/
 

三、路由 routers

3.1 SimpleRouter路由

引入

from rest_framework import routers

1、可以使用路由器对象,为视图集类自动生成路由条目
2、路由器对象默认只为通用action(create、list、retrieve、update、destroy)生成路由条目,自定义的action不会生成路由条目
3、创建SimpleRouter路由对象
 

router = routers.SimpleRouter()

4、使用路由器对象调用register方法进行注册

router.register(r'projects', views.ProjectViewSet)
  1. prefix指定路由前缀,如上r‘projects’
  2. viewset指定视图集类,不可调用as_view,如上views.ProjectViewSet
     

5、设置路由条目

方式一:路由器对象.urls属性可获取生成的路由条目

urlpatterns = [
  
    # 路由器对象.urls属性可获取生成的路由条目
    path('', include(router.urls)),
]

方式二:两个路由列表相加


# router.urls为列表
urlpatterns += router.urls

3.2 DefaultRouter路由

创建SimpleRouter路由对象

router = routers.SimpleRouter()

创建DefaultRouter路由对象

router = routers.DefaultRouter()


 DefaultRouter与SimpleRouter功能类似,仅有的区别为:DefaultRouter会自动生成一个根路由(显示获取数据的入口)

3.3 自定义action的路由处理

方式一:@action装饰器处理路由

自定义的action,不会自动生成路由,需要引入@action装饰器处理。

    @action(methods=['GET'], detail=False)
    def names(self, request, *args, **kwargs):
 
        return super().list(request, *args, **kwargs)

    @action(detail=True)
    def interfaces(self, request, *args, **kwargs):
        project = self.get_object()
        interfaces_qs = project.interfaces_set.all()
        interfaces_data = [{'id': interface.id, 'name': interface.name} for interface in interfaces_qs]
        return Response(interfaces_data, status=200)

 # 1、如果需要使用路由器机制自动生成路由条目,那么就必须得使用action装饰器
    # 2、methods指定需要使用的请求方法,如果不指定,默认为GET
    # 3、detail指定是否为详情接口,是否需要传递当前模型的pk值
    #   如果需要传递当前模型的pk值,那么detail=True,否则detail=False
    # 4、url_path指定url路径,默认为action方法名称
    # 5、url_name指定url路由条目名称后缀,默认为action方法名称
    # @action(methods=['GET'], detail=False, url_path='xxx', url_name='yyyy') 

方式二:在urls.py文件中,指定路由

    path('projects/', views.ProjectViewSet.as_view({
        'get': 'list',
        # 'get': 'names',
        'post': 'create'
    })),

四、同一个视图集ModelViewSet中,对同一个模型类不同形式的输出

场景:

一个视图集ModelViewSet,下有多个action方法,比如获取list 、获取数据详情retrieve

这两个action获取的是同一个序列化器类。

当我要求获取数据列表与获取详情的内容 展示字段不同。

4.1 视图集ModelViewSet 采用多个序列化器类

场景:

一个视图集ModelViewSet,下有多个action方法,比如获取list 、获取数据详情retrieve

这两个action获取的是同一个序列化器类。

当我要求获取数据列表与获取详情的内容 展示字段不同时,需要采用多个序列化器类。

一个视图集ModelViewSet,如何使用多个action对应多个序列化器?

重写get_serializer_class 方法。

    def get_serializer_class(self):
        """
        a.可以重写父类的get_serializer_class方法,用于为不同的action提供不一样的序列化器类
        b.在视图集对象中可以使用action属性获取当前访问的action方法名称
        :return:
        """
        if self.action == 'names':
            return ProjectsNamesModelSerailizer
        else:
            # return self.serializer_class
            return super().get_serializer_class()

4.2 重写action方法

场景:

一个视图集ModelViewSet,下有多个action方法,比如获取list 、获取数据详情retrieve

这两个action获取的是同一个序列化器类。

当我要求获取数据列表与获取详情的内容 展示字段不同时,重写action方法。

将多余的返回值干掉

    def retrieve(self, request, *args, **kwargs):
        response = super().retrieve(request, *args, **kwargs)
        response.data.pop('id')
        response.data.pop('create_time')
        return response

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/25872.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kafka 的内部结构和 kafka 的工作原理

基本设置 让我们开始安装kafka。下载最新的 Kafka 版本并解压缩。打开终端并启动 kafka 和 zookeeper。 $ cd $HOME $ tar -xzf kafka_<version>.tgz $ cd kafka_<version> $ bin/zookeeper-server-start.sh config/zookeeper.properties # open another termina…

Canvas画布基本功能及实现网页签名功能

canvas 简介 <canvas> 是 HTML5 新增的&#xff0c;一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画&#xff0c;甚至可以进行实时视频处理和渲染。和所有 DOM 元素一样&#xff0c;拥有自己…

Elasticsearch:数据是如何被写入的?

在我之前的文章 “Elasticsearch&#xff1a;索引数据是如何完成的”&#xff0c;我详述了如何索引 Elasticsearch 的数据的。在今天的文章中&#xff0c;我将从另外一个视角来诠释如何写入数据到 Elasticsearch。更多关于 Elasticsearch 数据操作&#xff0c;请阅读文章 “Ela…

实体店引流获客系统模式开发详解

随着互联网的日益发展&#xff0c;实体店的处境变得越来越艰难&#xff0c;获客难和销量差成为了实体店最头疼的两大问题。面对这种情况&#xff0c;一味固步自封是不行的&#xff0c;最好还是顺应潮流&#xff0c;结合一款合适的商业模式&#xff0c;来帮助自己快速引流获客和…

深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;接口隔离原则 系列文章目录1、接口隔离原则的定义和解读2、案例解读3、如何判断一个接口是否符合接口隔离原则&#xff1f;小结 1、接口隔离原则的定义和…

canal server 标准化集群搭建(完结)

4.2. 创建 server 所属集群&#xff1a;选择刚才添加的 “集群名称” server 名称&#xff1a; server_1、server_2、server_3 依次类推 server ip&#xff1a;server 的 ip 地址 admin 端口&#xff1a;canal server 与 canal admin 的通信端口&#xff0c;非生产环境从 2…

云南LED、LCD显示屏系统建设,户外、室内广告大屏建设方案

LED大屏幕显示系统是LED高清晰数字显示技术、显示单元无缝拼接技术、多屏图像处理技术、信号切换技术、网络技术等科技手段的应用综合为一体&#xff0c;形成一个拥有高亮度、高清晰度、技术先进、功能强大、使用方便的大屏幕投影显示系统。通过大屏幕显示系统&#xff0c;可以…

3.1 矩阵连乘问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 学习目标&#xff1a; 如果我要学习动态规划中的矩阵连乘问题&#xff0c;我会采取以下学习方法&#xff1a; 1. **理解问题的背景和目标&#xff1a;首…

【MySQL】如何速通MySQL(2)

&#x1f4cc;前言&#xff1a;本篇博客介绍如何速通MySQL的第二篇&#xff0c;主要介绍Mysql中主要的基础的入门&#xff0c;学习MySQL之前要先安装好MySQL&#xff0c;如果还没有安装的小伙伴可以看看博主前面的博客&#xff0c;里面有详细的安装教程。或者看一下下面这个链接…

SpringMVC第七阶段:SpringMVC的增删改查(01)

SpringMVC的增删改查 1、准备单表的数据库 drop database if exists springmvc;create database springmvc;use springmvc; ##创建图书表 create table t_book(id int(11) primary key auto_increment, ## 主键name varchar(50) not null, ## 书名 author varchar(50) no…

解决高并发

目录 1.4 对比单体系统、分布式系统和微服务系统 1.4.1 单体系统之痛 1、什么是单体系统 2、单体系统面临的问题 1.4.2 高并发系统之分布式架构 1.4.3 高并发系统之微服务架构 1.4 对比单体系统、分布式系统和微服务系统 接下来从企业真实场景出发&#xff0c;对比单体系统…

JavaEE进阶(5/29)SpringMVC

目录 1.复习 2.URL传参PathVariable 3.上传文件RequestPart 4.获取Cookie/Session/header 5.传统/维新获取cookies 6.传统/维信获得Header 7.获取Session&#xff08;非常重要&#xff09; 8.不加ResponseBody 9.如何获取Json数据&#xff0c;RequestBody 10.想…

python:容器:字符串——常用操作

字符串[下标]根据下标索引取出特定位置字符字符串.index(字符串)查找给定字符的第一个匹配项的下标字符串.replace(字符串1,字符串2) 将字符串内的全部字符串1&#xff0c;替换为字符串2 不会修改原字符串&#xff0c;而是得到一个新的 字符串.split(字符串) 按照给定字符串&am…

数据偏度介绍和处理方法

偏度&#xff08;skewness&#xff09;是用来衡量概率分布或数据集中不对称程度的统计量。它描述了数据分布的尾部&#xff08;tail&#xff09;在平均值的哪一侧更重或更长。偏度可以帮助我们了解数据的偏斜性质&#xff0c;即数据相对于平均值的分布情况。 有时&#xff0c;正…

Linux :: 【基础指令篇 :: 文件及目录操作:(2)】::Linux操作系统的文件“框架”、绝对路径与相对路径及路径定位文件对象的解释

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 本篇内容&am…

【JavaSE】Java基础语法(二十九):Map集合

文章目录 1. Map集合概述和特点2. Map集合的基本功能3. Map集合的获取功能【应用】4. Map集合的遍历(方式1)5. Map集合的遍历(方式2)6. map四种遍历方式 1. Map集合概述和特点 Map集合概述 interface Map<K,V> K&#xff1a;键的类型&#xff1b;V&#xff1a;值的类型…

笔记本电脑的BIOS是怎么保护安全的?

随着攻防技术的不断演进&#xff0c;像BIOS攻击、高级网络代码攻击等手段层出不穷&#xff0c;“受害者”也不仅限于企业级服务器、存储&#xff0c;很多魔爪也开始伸向了拥有商业机密数据的PC。 BIOS是Basic Input/Output System&#xff08;基本输入/输出系统&#xff09;的…

(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言 “Spring”在不同的上下文中表示不同的事物。它可以用来引用 …

ASP.NET Core

1. 入口文件 一个应用程序总有一个入口文件&#xff0c;是应用启动代码开始执行的地方&#xff0c;这里往往也会涉及到应用的各种配置。当我们接触到一个新框架的时候&#xff0c;可以从入口文件入手&#xff0c;了解入口文件&#xff0c;能够帮助我们更好地理解应用的相关配置…

用户验证FTP实验

用户FTP实验 目录 匿名用户验证&#xff1a; 本地用户验证&#xff1a; 本地用户访问控制&#xff1a; 匿名用户验证&#xff1a; 例&#xff1a;&#xff08;前提配置&#xff0c;防火墙关闭&#xff0c;yum安装&#xff0c;同模式vmware11&#xff09; 现有一台计算机huy…