DRF 序列化类serializer单表

【五】序列化类serializer单表

【1】主要功能

  1. 快速序列化
    • 将数据库模型类对象转换成响应数据,以便前端进行展示或使用。
    • 这些响应数据通常是以Json(或者xml、yaml)的格式进行传输的。
  2. 反序列化之前数据校验
    • 序列化器还可以对接收到的数据进行验证,确保数据的完整性和准确性。这有助于防止因数据错误或恶意输入导致的安全问题。
  3. 反序列化
    • 序列化类也能将前端发送的请求数据(如json、xml、yaml格式的数据)转换成模型类对象,便于后端进行处理。

【2】序列化功能

(1)自定义序列化类

  • 这是模型表的字段
from django.db import modelsclass Book(models.Model):book_name = models.CharField(max_length=64, verbose_name='书名')book_price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='价格')publish_name = models.CharField(max_length=64, verbose_name='出本社名字')
  • 这是自定义的序列化类
    • 这里的每个字段和序列化类的每个字段一一对应
from rest_framework import serializersclass BookSerializer(serializers.Serializer):book_name = serializers.CharField()book_price = serializers.IntegerField()publish_name = serializers.CharField()

(2)视图层中使用

  • 使用语法

    • 自定义序列化类(instance=模型表的数据, many=True)
    • instance参数:可以传入模型表的queryset对象,也可以是单个querydict对象
    • many参数:默认为False, 针对前面的instance对象
      • 如果传入的是多条数据即queryset对象,那么就需要置为True
      • 如果传入的是单条数据即querydict对象,那么就需要置为False
  • 可以很明显的发现

    • 使用序列化内极其容易的将模型表的所有信息转换为列表传回了前端(因为是多条数据所以是个列表,如果是单条数据那么就是一个字典)
    • 如果不适用序列化类,那么需要一次循环出所有的对象,然后一次根据模型表的字段进行赋值操作,这是极其繁琐
class BookAPIView(APIView):def get(self, request, *args, **kwargs):book_queryset = Book.objects.all()# 使用序列化类book_ser = BookSerializer(instance=book_queryset, many=True)# 不适用序列化类results = []for info_obj in book_queryset:info_dict = dict()info_dict['book_name'] = info_obj.book_nameinfo_dict['book_price'] = info_obj.book_priceinfo_dict['publish_name'] = info_obj.publish_nameresults.append(info_dict)return Response({'code': 100, 'msg': '查询成功', 'ser_results': book_ser.data, 'results': results})

image-20240413150929536

【3】校验数据

(0)语法

  • book_ser = BookSerializer(data=request.data)
    • data参数:传入需要校验的数据
    • 因为用的是APIView,所以直接传入request.data即可
  • book_ser.is_valid()
    • 调用is_valid()方法会触发序列化器中的所有验证逻辑,包括字段级别的验证(局部钩子)和对象级别的验证(全局钩子)。
    • 如果数据通过了所有验证,is_valid()将返回True;否则,返回False
  • book_ser.data
    • 如果数据通过了验证(即book_ser.is_valid()返回True),可以通过book_ser.data访问经过验证和转换的数据。
  • book_ser.errors
    • 如果数据验证失败,book_ser.errors将包含一个字典,其中列出了所有验证失败的字段以及相应的错误信息。

(1)字段参数校验

  • 在自定义的序列化类中,每个字段是有一些参数的
    • 这里添加一些参数进行校验
    • 比如字符类型的长度检验,整型的最大、最小值检验等等
book_name = serializers.CharField(max_length=12, min_length=2)
book_price = serializers.IntegerField(max_value=500, min_value=50)

(2)钩子检验

  • 钩子分为两种,一种是局部钩子,另一种是全局钩子

    • 无论是哪种钩子函数,都需要将勾出来的数据返回回去
  • 局部钩子:

    • 是针对序列化器中单个字段的验证方法。
    • 通常遵循validate_<field_name>的命名模式,其中<field_name>是要验证的字段名。
    • 当序列化器执行验证时,它会自动调用这些局部钩子方法。
  • 全局钩子:

    • 用于验证整个序列化器数据集的方法。
    • 全局钩子通常覆盖序列化器中的validate方法。
    • 这个方法接收一个包含所有字段值的字典作为参数,并允许执行跨字段的验证逻辑。
# 序列化类
from rest_framework import serializers
from rest_framework.exceptions import ValidationErrorclass BookSerializer(serializers.Serializer):# 字段参数检验book_name = serializers.CharField(max_length=12, min_length=2)book_price = serializers.IntegerField(max_value=500, min_value=50)publish_name = serializers.CharField()# 局部钩子检验def validate_book_name(self, book_name):if any([i in book_name for i in ['*', '/', '=', '%', '@']]):raise ValidationError("书名不能还有特殊字符")return book_name# 全局钩子检验def validate(self, attrs):if attrs.get('book_name') == attrs.get('publish_name'):raise ValidationError('书名和出版社名不能一样')return attrs
# 视图层
class BookAPIView(APIView):def post(self, request, *args, **kwargs):book_ser = BookSerializer(data=request.data)if book_ser.is_valid():return Response({'code': 100, 'msg': '校验通过', 'data': book_ser.data})return Response({'code': 1002, 'msg': '校验失败', 'err': book_ser.errors})
  • 结果

image-20240413153344596

【4】反序列化保存

(1)语法

  • book_ser=BookSerializer(instance=obj,data=request.data)

    • instance参数:这个参数主要是在修改保存的时候才使用,传入的数据可以是对象,也可以是id等等
    • data参数:这个还是传入的需要反序列化的内容
  • book_ser.save()

    • 用于将验证通过的数据保存为数据库中的记录
  • 小拓展

    • save中可以给额外参数
    • 比如.save(time=datetime.datetime.now())
    • 这个需要模型表中有time的字段,结果就是将当前时间也保存在表中,不用经过数据校验

(2)两种保存方式

  • 反序列化保存同样分为两个:

    • 一个是创建新数据保存,一个是更新老的数据保存,这两个有很大的差别
    • 无论是哪个都需要返回创建或修改后的数据
  • 首先说创建新的数据

    • 必须要重写create()方法,这个比较简单,直接通过模型创建即可
  • 然后说修改保存

    • 这里的视图层必须要传如一个要修改数据的相关信息,要不然是不知道修改谁的
    • 可以传入pk,根据pk过滤以后使用update方法即可
    • 可以传入obj,可以使用难度较高的反射,也可以一个字段一个字段的改

image-20240413161025947

  • 视图层
class BookAPIView(APIView):def put(self, request, *args, **kwargs):pk = kwargs.get('pk')book_obj = Book.objects.filter(pk=pk).first()book_ser = BookSerializer(instance=book_obj, data=request.data)if book_ser.is_valid():book_ser.save()  # 需要重写update方法return Response({'code': 100, 'msg': '修改成功', 'data': book_ser.data})return Response({'code': 1002, 'msg': '修改失败', 'err': book_ser.errors})def post(self, request, *args, **kwargs):book_ser = BookSerializer(data=request.data)if book_ser.is_valid():book_ser.save()  # 需要重写create放啊return Response({'code': 100, 'msg': '校验通过', 'data': book_ser.data})return Response({'code': 1002, 'msg': '校验失败', 'err': book_ser.errors})
  • 序列化类
from rest_framework.exceptions import ValidationErrorclass BookSerializer(serializers.Serializer):# 字段参数检验book_name = serializers.CharField(max_length=12, min_length=2)book_price = serializers.IntegerField(max_value=500, min_value=50)publish_name = serializers.CharField()def create(self, validated_data):book = Book.objects.create(**validated_data)return bookdef update(self, instance, validated_data):for key, value in validated_data.items():setattr(instance, key, value)  # 使用反射修改数据return instance

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

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

相关文章

宝塔要注意的问题

数据库创建访问权限要全部人 反向代理1 打包dist,并不会有反向代理&#xff0c;所以宝塔里面要配置 反向代理2 这种去掉/api为/&#xff0c;上面的并没有去掉 rewrite ^/api/(.*)$ /$1 break;

hcia datacom课程学习(6):路由与路由表基础

1.路由的作用 不同网段的设备互相通信需要具有路由功能的设备进行转发 具有路由功能的设备不一定是路由器&#xff0c;交换机可以有路由功能&#xff0c;同样的&#xff0c;路由器也可以有交换功能&#xff0c;像家里常用的路由器就是集路由功能和交换功能于一体的 2.路由相…

【SAP NWDI】创建DC(Development component)(三)

一、准备DC组件包 首先需要下载下面这7个sca 的组件包,找到对应的ME版本的组件包,可以找对应的Basis帮忙下载。然后把这7个组件包放入到服务器中根目录的这个目录中,如果目录没有的需要自己创建出来。 二、导入DC组件包 注意:下面的的图中 有需要填写 in 和 out 的连个目…

网络编程 day5

select实现TCP并发服务器&#xff1a; #include<myhead.h> #define SER_IP "192.168.125.199" //服务器IP地址 #define SER_PORT 6666 //服务器端口号int main(int argc, const char *argv[]) {//1、创建套节字&#xff1a;用于接收…

视频汇聚/安防视频监控云平台EasyCVR云端录像播放与下载的接口调用方法

视频汇聚/安防视频监控云平台EasyCVR支持多协议接入、可分发多格式的视频流&#xff0c;平台支持高清视频的接入、管理、共享&#xff0c;支持7*24小时不间断监控。视频监控管理平台EasyCVR可提供实时远程视频监控、录像、回放与存储、告警、语音对讲、云台控制、平台级联、磁盘…

Windows平台下的Oracle 19c补丁升级

Windows平台下的Oracle 19c补丁升级 文章目录 Windows平台下的Oracle 19c补丁升级第一章 概述第二章 安装前备份2.1 软件目录备份2.2 权限备份2.3 备份数据库 第三章 安装前检查3.1 查看数据库版本3.2 升级opatch版本 第四章 安装补丁4.1 设置环境变量4.2 关闭oracle相关服务4.…

kafka安装配置及使用

kafka安装配置及使用 kafka概述 Kafka 是一个分布式流处理平台和消息队列系统&#xff0c;最初由 LinkedIn 公司开发并开源。它设计用于处理大规模的实时数据流&#xff0c;并具有高可扩展性、高吞吐量和持久性等特性。以下是 Kafka 的一些主要特点和用途&#xff1a; 分布式架…

构建未来跨境电商平台:系统架构与关键技术

随着全球市场的日益融合和电子商务的快速发展&#xff0c;跨境电商平台成为了连接全球买家和卖家的重要桥梁&#xff0c;为消费者提供了更广阔的购物选择&#xff0c;为企业拓展国际市场提供了更广阔的机会。而要构建一个高效、稳定的跨境电商平台&#xff0c;除了吸引人们的注…

n皇后问题-java

本次n皇后问题主要通过dfs&#xff08;深度优先搜索&#xff09;实现&#xff0c;加深对深度优先搜索的理解。 文章目录 前言 一、n皇后问题 二、算法思路 三、使用步骤 1.代码如下 2.读入数 3.代码运行结果 总结 前言 本次n皇后问题主要通过dfs&#xff08;深度优先搜索&#…

象棋教学辅助软件介绍

背景 各大象棋软件厂商都有丰富的题目提供训练&#xff0c;但是其AI辅助要么太弱&#xff0c;要么要付费解锁&#xff0c;非常不适合我们这些没有赞助的业余棋手自行训练&#xff0c;于是我需要对其进行视觉识别&#xff0c;和AI训练&#xff0c;通过开启这个辅助软件&#xf…

设计模式学习(六)——《大话设计模式》

设计模式学习&#xff08;六&#xff09;——《大话设计模式》 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff0c;也称为静态工厂方法模式&#xff0c;它属于类创建型模式。 在简单工厂模式中&#xff0c;可以根据参数的不同返回不同类的实例。简单工厂…

构建现代网页的引擎:WebKit架构揭秘

在网络信息迅猛增长的今天&#xff0c;浏览器已经成为我们接触世界的重要窗口。而在浏览器的核心&#xff0c;有一个强大的引擎在默默地支撑着网页的渲染和执行&#xff0c;这就是WebKit。 WebKit的核心组件 WebKit作为开源浏览器引擎&#xff0c;由苹果公司发展而来&#x…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想&#xff0c;对于两个有序数组&#xff0c;我们分别取他们首元素比较大小&#xff0c;取小的插…

Unity给地图物体添加对撞机

在项目/Assets下创建Prefabs文件夹 选择素材拖入层级下&#xff0c;注意此时地图素材有可能看不到&#xff0c;此时选择Tilemap在检查器中修改图层顺序调至最低。 添加对撞机 选择素材&#xff0c;在检查器中点击添加组件Box Collider 2D&#xff0c;将素材拖入Prefabs文件下…

【Arduino IDE 环境配置】

目录 Arduino IDE 环境配置 1. 安装方式2. 操作方法&#xff08;Arduino中文社区&#xff09; 2.1. 安装Arduino IDE2.2. 下载固件2.3. 修改Arduino IDE语言2.4. 添加开发板管理网址2.5. 运行离线包2.6. 检查安装是否成功 下载Arduino IDE&#xff1a; 如果你还没有安装Arduin…

如何使用Postgres的JSONB数据类型进行高效查询

文章目录 解决方案1. 创建包含JSONB列的表2. 插入JSON数据3. 使用GIN索引加速查询4. 执行高效的JSONB查询 示例代码解释 PostgreSQL的JSONB数据类型提供了一种灵活的方式来存储和查询JSON格式的数据。JSONB不仅允许你在PostgreSQL数据库中存储JSON文档&#xff0c;而且还对这些…

科技云报道:大模型加持后,数字人“更像人”了吗?

科技云报道原创。 北京冬奥运AI 虚拟人手语主播、杭州亚运会数字人点火、新华社数字记者、数字航天员小诤…当随着越来越多数字人出现在人们生活中&#xff0c;整个数字人行业也朝着多元化且广泛的应用方向发展&#xff0c;快速拓展到不同行业、不同场景。 面向C端&#xff0…

.NET开源免费的跨平台框架 - MAUI(附学习资料)

前言 前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium&#xff0c;然后技术群有不少同学问.NET MAUI是不是免费的&#xff1f;能做什么&#xff1f;今天特意写这篇文章来介绍一下.NET开源、免费&#xff08;基于MIT License&#xff09;的跨平台框架&#xff1a;MAUI。…

【刷题笔记】第八天

文章目录 [928. 尽量减少恶意软件的传播 II](https://leetcode.cn/problems/minimize-malware-spread-ii/)方法1&#xff1a;dfs方法2&#xff1a;并查集 [GCD and LCM](https://vjudge.net.cn/problem/Aizu-0005)[Missing Bigram](https://vjudge.net.cn/problem/CodeForces-1…

基于springboot+vue+Mysql的简历系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…