八、视图集ModelViewSet(重点)

news2024/9/30 5:32:00

上一章:

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

下一章:

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

一、视图集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会自动生成一个根路由(显示获取数据的入口)

四、同一个视图集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.coloradmin.cn/o/585822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第13届蓝桥杯Scratch国赛真题集锦

编程题 第 1 题 问答题 LED屏幕 题目说明 编程实现 LED屏幕 具体要求: 1).点击绿旗,在舞台中心区域出现由10 x 10方格组成的LED屏幕; 2).按下空格键,LED屏幕最外环方格全部点亮 (方格变为黄色) 3).LED屏幕每秒向内点亮一层,其它LED灯熄灭; 4).直到LED灯在最中心点亮2秒…

games101作业5

作业要求 • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个…

字节跳动测开岗面试居然这么简单....

因为读者里有不少刚入门测试的同学,这两天抽空整理了一份字节测开实习的面试题答案,说实话这个题目真挺简单的,如果你面大厂碰到此类面试题,也算是运气很好啦。大家也可以先自测一下,看看自己能不能答上来。 如果觉得…

vscode 插件 remote-ssh的安装及使用

文章目录 vscode 插件 remote-ssh的安装及使用windows VSCode(clangdremote-ssh) linux(clangd server) 开发环境问题问题1 : getPlatformForHost was canceled问题2 : host 主机不能联互联网问题3 : 每次都要输入密码 vscode 插件 remote-ssh的安装及使用 需要用到的东西1. r…

安装nodejs环境搭建vue项目的框架

说明:想要搭建一个vue项目的框架,先要安装nodejs环境;我的电脑已经安装过,先卸载掉,重新装一遍(卸载nodejs参考:http://t.csdn.cn/jHmCU) 一、安装nodejs环境 第一步:下…

ssh无密码链接

ssh的基本语法为 ssh host 然后输入密码才可以 如果a想要免密登录b,则a需要将自己的公钥放在b上,原理如下图: 例如,以aricoder这个用户登录的情况下,在服务器01上生成密钥,命令为 ssh-keygen -t rsa然后连…

前端面试题汇总大全二(含答案超详细,Vue,TypeScript,React,Webpack 汇总篇)-- 持续更新

前端面试题汇总大全(含答案超详细,HTML,JS,CSS汇总篇)-- 持续更新 前端面试题汇总二 五、Vue 篇1. 谈谈你对MVVM开发模式的理解?2. v-if 和 v-show 有什么区别?3. r o u t e 和 route和 route和router区别4.vue自定义…

千万级oracle数据表定时同步到mysql表的方案

1:业务背景 第三方系统提供了一张oracle视图,该视图有六千多万条数据,后续每月会产生三百万条数据的数据。需要每天将数据定时同步到自己系统的mysql表中。 (注:我们系统与外界系统访问都要经过一个中间系统的跳转才…

看我0~1精通自动化测试实战,暴涨18K...

前言 开头,先说一下现主流的接口自动化测试框架配套,也是很多企业在使用的。 接口自动化测试:PythonrequestspytestyamlalluerJenkins; Python自动化测试:7天练完这60个实战项目,年薪过35w。 除开测试脚本…

基于秒杀-----分布式锁----lua脚本

基于商品显示秒杀-一人一单业务_xzm_的博客-CSDN博客改进 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁 分布式锁的五个基本要求:多进程可见,互斥,高可用,高性能,安全性 三种实现方式 redi…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 9 Recommendation Systems

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 9 Recommendation SystemsRecommendation systems use a number of different technologies. We can classify these systems into two broad groups. Content-based systems examine properties…

STL 函数对象,即仿函数

目录 1.函数对象 1.1函数对象的概念 1.2函数对象的使用 2.谓词 2.1谓词概念 2.2一元谓词 2.3二元谓词 3.内建函数对象 3.1内建函数对象的意义 3.2算术仿函数 3.3关系仿函数 3.4逻辑仿函数 1.函数对象 1.1函数对象的概念 1.2函数对象的使用 #include<iostream>…

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

七、设计算法&#xff0c;仅使用三次实数乘法即可完成复数 abi和cdi 相乘。算法需接收a、b、c和d 为输入&#xff0c;分别生成实部 ac-bd 和虚部adbc。 文心一言&#xff1a; 可以使用如下算法来计算复数 abi 和 cdi 的积&#xff0c;且只需进行三次实数乘法&#xff1a; 1.…

Slower使用教程完整版本【2023年更新】

Slower软件的版本&#xff0c;目前市面上有多种。 如果你指的是Slower器加速软件的话&#xff0c;可以看下面的教程&#xff1a; Slower是一款很不错的安全国际互联网工具&#xff0c;广泛用于外贸与留学生行业&#xff0c;设计师行业与科研行业。但是&#xff0c;因为使用过…

注意:腾讯云轻量应用服务器十大限制说明

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的&#xff0c;比如轻量服务器不支持更换内网IP地址&#xff0c;不支持自定义私有网络VPC&#xff0c;内网连通性方面也有限制&#xff0c;轻量不支持CPU内存、带宽或系统盘单独升级&#xff0c;只能整个套餐整体升级&#x…

IO系统(计算机组成原理)

IO系统这一章主要讲的就是IO的四种控制方式&#xff0c;首先对这四种方式进行一个简单介绍&#xff0c;下面再对着四种方式分别进行介绍。 程序查询方式&#xff1a;由cpu通过程序不断查询IO设备是否已经做好准备&#xff0c;从而控制IO设备于主机进行信息交换 程序中断方式&am…

python自动化测试面试题,25K入职字节测试岗

问&#xff1a; http 和 https的区别   答&#xff1a; https需要申请ssl证书&#xff0c;https是超文本传输协议&#xff0c;信息是明文传输&#xff0c;https则是具有安全性的ssl加密传输协议http和https使用的是不同的链接方式&#xff0c;用的端口也不一样&#xff0c;前…

《深入理解计算机系统》读书笔记1

1.1信息就是位上下文 只由ASCLL字符构成的文件称为文本文件&#xff0c;所有其他文件都称为二进制文件。 系统中的所有的信息都由一串比特表示。区分不同数据对象的唯一方法是读到这些数据对象时的上下文。 1.2程序被其他程序翻译成不同的格式 预编译&#xff0c;编译&#xf…

【C++】类的访问权限

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01;时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 在 C 中&#xff0c;类在设计时&#xff0c;可以把 属性 和 行为 放在不同的权限下加以…

智警杯赛前学习1.1---excel基本操作

修改默认设置 步骤一&#xff1a;打开“Excel选项”窗口&#xff0c;打开“文件”菜单&#xff0c;选择“选项”标签 步骤二&#xff1a;在“Excel选项”窗口中&#xff0c;选择“常规与保存”标签&#xff0c;在“常规与保存”标签中&#xff0c;可以修改录入数据时的默认字体…