当前位置: 首页 > news >正文

四、DRF序列化器create方法与update方法

上一章:

二、Django REST Framework (DRF)序列化&反序列化&数据校验_做测试的喵酱的博客-CSDN博客

下一章:

五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客 

一、背景

1、创建请求,post,用户输入json数据,就可以直接创建一条数据

2、更新请求,put,需要两类数据:

  1. 用户传入的json数据,具体需要更新的哪些字段。
  2. 需要先去库里取出需要更新的实例,再来对它更新。

我们现在的post 创建 与put更新请求。都是在views.py视图函数中,利用ORM框架进行的数据库操作。

创建请求,post

    # 创建班级def post(self,request):# 1、获取json参数并转化为python中的数据类型(字典)try:dic_data = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 获取反序列化的实例对象class_obj = ClassSerializer(data=dic_data)# 对数据进行校验# 校验不通过if not class_obj.is_valid():return JsonResponse(class_obj.errors, status=400)# 创建数据,执行saqlmiaoclass = MiaoClass.objects.create(**class_obj.validated_data)# 对创建的数据进行数据回显(序列化)serializer = ClassSerializer(instance=miaoclass)return JsonResponse(serializer.data, status=201)

更新请求,put:

  def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 3、获取json参数并转化为字典try:dic = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 4、序列化,将 用户输入的字典,转化为序列化实例serializer_obj=StudentSerializer(data=dic)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status=400)# 6、更新数据,操作数据库student_obj.sname = serializer_obj.validated_data.get('sname')student_obj.sgender = serializer_obj.validated_data.get('sgender')student_obj.sid = serializer_obj.validated_data.get('sid')student_obj.sscore = serializer_obj.validated_data.get('sscore')student_obj.classid_id = serializer_obj.validated_data.get('classid_id')student_obj.save()# 7、数据回显示(非必需的)。将读取的项目数据转化为字典serializer = StudentSerializer(instance=student_obj)return JsonResponse(serializer.data, status=201)

二、序列化器create方法与update方法

上面处理 数据库操作,是在views视图函数中进行的,现在

将操作数据库的行为 封装到 序列化器类中。

post create创建操作,通过序列化器create 方法实现

put update更新操作,通过序列化器update方法实现。

2.1 序列化器create方法

原post 创建请求


class StudentsView(View):# 查询所有数据def get(self,request):# 获取列表数据queryset = MiaoStudent.objects.all()print(queryset)serializer = StudentSerializer(instance=queryset, many=True)return JsonResponse(serializer.data, safe=False)# 创建数据def post(self, request):# 1、获取json参数并转化为python中的数据类型(字典)try:dic_data = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 获取反序列化的实例对象student_serializer_obj = StudentSerializer(data=dic_data)# 对数据进行校验# 校验不通过if not student_serializer_obj.is_valid():return JsonResponse(student_serializer_obj.errors, status=400)# 创建数据,执行saqlstudent=MiaoStudent.objects.create(**student_serializer_obj.validated_data)# 对创建的数据进行数据回显(序列化)serializer = StudentSerializer(instance=student)return JsonResponse(serializer.data, status=201)

1、将原有的创建数据的代码

# 创建数据,执行saqlstudent=MiaoStudent.objects.create(**student_serializer_obj.validated_data)

替换成

        # 创建数据,执行saql# student=MiaoStudent.objects.create(**student_serializer_obj.validated_data)# 通过序列化器操作数据库student_serializer_obj.save()# 对创建的数据进行数据回显(序列化)#serializer = StudentSerializer(instance=student)return JsonResponse(student_serializer_obj.data, status=201)

当构建序列化器对象时,只传入data= 参数。

       # 获取反序列化的实例对象student_serializer_obj = StudentSerializer(data=dic_data)

序列化器再调用save方法时,实际调用的是序列化器中的create方法。(根据创建对象时,传入的参数,来判断执行save方法时,具体调用create方法还是update方法。

构建序列化器实例时,只传 data= ,调用save时,调用的是create方法。

构建序列化器实例时,同时传 data= 与instance=,调用save时,调用的是update方法。

2、在序列化器中,创建create方法

    def create(self, validated_data: dict):project_obj = MiaoStudent.objects.create(**validated_data)return project_obj

将执行数据库的操作,放到create方法中。

其中:

  1. validated_data: dict 为,经过校验之后,获取的用户输入数据,时一个字典。

3、save方法关键字传参

执行save方法。

student_serializer_obj.save()

用户输入的是哪些字段,则在操作数据库时,就使用的哪些字段。

实现功能:

我不仅要获取用户输入的哪些字段,我还要在程序上额外加一些我想要加的字段。

可以通过 

.save(关键字1:"值1",关键字2:"值2")

传入。

create方法,获取,经过校验的用户传入validated_data,是一个字典。这个字典就包含我们刚刚额外传入的数据。

举例:

调用save时传入

student_serializer_obj.save(address="北京",hobby="play")

执行create方法,取出额外数据。

    def create(self, validated_data: dict):address = validated_data.pop("address")hobby = validated_data.pop("address")                  project_obj = MiaoStudent.objects.create(**validated_data)return project_obj

2.2 序列化器update方法

views视图中,put 原来的代码

    def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 3、获取json参数并转化为字典try:dic = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 4、序列化,将 用户输入的字典,转化为序列化实例serializer_obj=StudentSerializer(data=dic)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status=400)# 6、更新数据,操作数据库student_obj.sname = serializer_obj.validated_data.get('sname')student_obj.sgender = serializer_obj.validated_data.get('sgender')student_obj.sid = serializer_obj.validated_data.get('sid')student_obj.sscore = serializer_obj.validated_data.get('sscore')student_obj.classid_id = serializer_obj.validated_data.get('classid_id')student_obj.save()# 7、数据回显示(非必需的)。将读取的项目数据转化为字典serializer = StudentSerializer(instance=student_obj)return JsonResponse(serializer.data, status=201)

1、视图函数:创建序列化实例时,使用data= , instance=

student_obj = MiaoStudent.objects.get(id=pk)
dic = json.loads(request.body)
serializer_obj = StudentSerializer(data=dic, instance=student_obj)

修改后视图函数的整体代码


class StudentsDetailView(View):def get(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)serializer = StudentSerializer(instance=student_obj)return JsonResponse(serializer.data)def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 3、获取json参数并转化为字典try:dic = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 4、序列化,将 用户输入的字典,转化为序列化实例# serializer_obj=StudentSerializer(data=dic)serializer_obj = StudentSerializer(data=dic, instance=student_obj)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status=400)# 6、更新数据,操作数据库# student_obj.sname = serializer_obj.validated_data.get('sname')# student_obj.sgender = serializer_obj.validated_data.get('sgender')# student_obj.sid = serializer_obj.validated_data.get('sid')# student_obj.sscore = serializer_obj.validated_data.get('sscore')# student_obj.classid_id = serializer_obj.validated_data.get('classid_id')# student_obj.save()serializer_obj.save()# 7、数据回显示(非必需的)。将读取的项目数据转化为字典# serializer = StudentSerializer(instance=student_obj)return JsonResponse(serializer_obj.data, status=201)

2、序列化器中update方法

    def update(self, instance, validated_data: dict):# for key, value in validated_data.items():#     setattr(instance, key, value)# validated_data 是经过校验后,用户传入的数据instance.sname = validated_data.get('sname') or instance.snameinstance.sgender = validated_data.get('sgender') or instance.sgenderinstance.sid = validated_data.get('sid') or instance.sidinstance.sage = validated_data.get('sage') or instance.sageinstance.sscore = validated_data.get('sscore') or instance.sscoreinstance.classid_id = validated_data.get('classid_id') or instance.classid_idinstance.save()return instance
  1. or 是对值为空时的处理

相关文章:

四、DRF序列化器create方法与update方法

上一章: 二、Django REST Framework (DRF)序列化&反序列化&数据校验_做测试的喵酱的博客-CSDN博客 下一章: 五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客 一、背景 1、创建请求,post,用户输入…...

洛谷P8792 最大公约数

[蓝桥杯 2022 国 A] 最大公约数 题目描述 给定一个数组,每次操作可以选择数组中任意两个相邻的元素 x , y x, y x,y 并将其中的一个元素替换为 gcd ⁡ ( x , y ) \gcd(x, y) gcd(x,y),其中 gcd ⁡ ( x , y ) \gcd(x, y) gcd(x,y) 表示 x x x 和 y…...

【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用

文章目录 一、需求环境/版本 二、须知2.1、什么是RPC?2.2、什么是Dubbo?2.3、什么是Nacos? 三、普通的SpringBoot项目集成微服务组件方案(笔者给出两种)方案一(推荐)1、导入maven依赖&#xff0…...

MySQL主从同步(开GTID)

目录 一、搭建简单的主从同步 二、mysql删除主从(若没有配置过可以不用进行这一步) 1、停止slave服务器的主从同步 2、重置master服务 三、开启GTID 1、Master配置 2、Slave配置 一、搭建简单的主从同步 GTID原理:http://t.csdn.cn/g…...

打造精细化调研,这些产品榜上有名,你用了吗?

调查问卷是一种流行的数据收集工具,研究人员、营销人员和企业使用它来征求目标受众的反馈意见。调查问卷工具使创建、分发和分析调查问卷的过程变得更加简单和高效。想要做好一份调查问卷,选择一款好用的工具是少不了的。不过,在众多的问卷工…...

[golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

一.全文搜索引擎 ElasticSearch 的介绍,以及安装配置前的准备工作 介绍 ElasticSearch 是一个基于 Lucene 的 搜索服务器,它提供了一个 分布式多用户能力的 全文搜索引擎,基于 RESTful web 接口,Elasticsearch 是用 Java 开发的,并作为 Apach…...

赋的几个发展阶段

赋,起源于战国,形成于汉代,是由楚辞衍化出来的,也继承了《诗经》讽刺的传统。关于诗和赋的区别,晋代文学家陆机在《文赋》里曾说: 诗缘情而绮靡,赋体物而浏亮。 也就是说,诗是用来抒发主观感情…...

Model-Free TD Control: Sarsa

import time import random # 相对于Q 效果会差一些 class Env():def __init__(self, length, height):# define the height and length of the mapself.length lengthself.height height# define the agents start positionself.x 0self.y 0def render(self, frames50):fo…...

CloudBase CMS的开发注意事项

引言 在进行基于云开发的微信小程序开发时为了减轻工作量打算用CloudBase CMS来减轻工作量,随后去了解并体验了CloudBase CMS的使用,总体来说还有些许问题没有解决,对减轻后台管理工作并没有起到很大的作用。 项目情景 使用CloudBase CMS来管…...

大佬联合署名!反对 ACL 设置匿名期!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 近日,自然语言处理领域的多位知名学者联合发起了一项反对 ACL 设置匿名期的联合署名行动,包括著名学者 William Wang 和 Yoav Goldberg 在内,还有Christopher Potts、Hal Daume、Luke Zettl…...

【JavaSE】Java基础语法(十四):Static

文章目录 概述特点与应用注意事项为什么一个静态方法中只能访问用static修饰的成员? 概述 Java中的static是一个修饰符(也可称关键字),可以用于修饰变量、方法和代码块。 特点与应用 static修饰的成员具有以下特点: 被类的所有对…...

1.Linux初识

在 Linux 系统中,sudo 是一个重要的命令,可以允许普通用户以管理员权限来运行特定的命令。通过 sudo 命令,普通用户可以暂时获取管理员权限,执行需要管理员身份才能执行的操作。 下面是一些关于 sudo 命令的用法: 以管…...

进程(二)

这一节我们写个MFC剪切板程序 1.下载相应的组件 工具->工具视图,因为之前已经下载过一部分了,这里如果创建MFC报错的话,就要把没下载的补上 此项目需要MFC库 解决方法 2.创建MFC程序 3.打开资源视图,直接在菜单栏顶部搜索…...

《消息队列高手课》课程笔记(二)

消息模型:主题和队列有什么区别? 两类消息模型 早期的消息队列,就是按照“队列”的数据结构来设计的。 生产者(Producer)发消息就是入队操作,消费者(Consumer)收消息就是出队也就是…...

以“智”提质丨信创呼叫

随着人工智能、大数据、云计算等新兴技术飞速发展,呼叫中心、全媒体智能客服等现已被广泛应用于多个行业领域。其中,呼叫中心作为政企对外服务的重要窗口,已从“传统电话营销”发展到“智能呼叫中心”阶段,以客户服务为核心&#…...

Pool与PG的说明以及Ceph的IO流程

Pool与PG的说明以及Ceph的IO流程 Pool与PG Ceph中的数据是以对象的形式存储在存储池(pool)中的。每个存储池都被划分为若干个存储组(PG),每个存储组同时也是一个数据分片(shard)。存储组是Ceph用来实现数据的分布式存储和高可用的重要组成部分。每个存储组包含若干…...

20230529_Hadoop_集群操作命令

HDFS_集群操作命令: 一、集群启停命令 # 启动Hadoop的HDFS进程start-dfs.sh# 关闭Hadoop的HDFS进程stop-dfs.sh# 单独关闭某一个进程hadoop-daemon.sh start[/stop] namenode[/datanode/secondarynamenode]二、HDFS文件系统的基本信息 数据的路径表达方式&#xff…...

边缘计算AI硬件智能分析网关V1版的接入流程与使用步骤

我们的AI边缘计算网关硬件——智能分析网关目前有两个版本:V1版与V2版,两个版本都能实现对监控视频的智能识别和分析,支持抓拍、记录、告警等,在AI算法的种类上和视频接入上,两个版本存在些许的区别。V1的基础算法有人…...

【redis】Stream、String 超详细介绍

文章目录 一、Stream1.1 写入数据XADD条目 ID 的格式 1.2 获取数据XRANGE 和 XREVRANGEXREAD 监听新条目非阻塞形式阻塞形式 1.3 消费者组XGROUP 创建消费者组XREADGROUP 通过消费者组消费XACK 确认消息消费者组示例 1.4 XPENDING 和 XCLAIM 认领 其他消费者 的待处理消息XPEND…...

算法基础学习笔记——⑫最小生成树\二分图\质数\约数

✨博主:命运之光 ✨专栏:算法基础学习 目录 ✨最小生成树 🍓朴素Prim 🍓Kruskal算法 ✨二分图 🍓匈牙利算法 ✨质数 🍓(1)质数的判定——试除法 🍓(2&…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

抽象类和接口(全)

一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...