DRF 序列化类serializer单表

【五】序列化类serializer单表

【1】主要功能

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

【2】序列化功能

(1)自定义序列化类

  • 这是模型表的字段
from django.db import models

class 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 serializers

class 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_name
            info_dict['book_price'] = info_obj.book_price
            info_dict['publish_name'] = info_obj.publish_name
            results.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 ValidationError

class 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 ValidationError

class 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 book

    def update(self, instance, validated_data):
        for key, value in validated_data.items():
            setattr(instance, key, value)  # 使用反射修改数据
        return instance

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

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

相关文章

学习 Rust 的第六天:所有权问题

大家好&#xff0c; 欢迎来到学习 Rust 的第 6 天&#xff0c;过去 5 天我们学到的内容在几乎每种语言中都是一样的。所有权是 Rust 的一个独特概念。 介绍 所有权是一种独特的内存管理系统&#xff0c;其中每个值都有一个指定的所有者&#xff0c;在所有者超出范围时自动释…

java实现wav的重采样

原因是之前写的TTS文件&#xff0c;需要指定采样率和单声道 但是TTS是用的Jacob调用COMsapi实现的 javaWNI10JACOB方式 SAPI底层支持的是C&#xff0c;C#【官方文档】 SpAudioFormat SetWaveFormatEx method (SAPI 5.4) | Microsoft Learn 用C实现的方式【可指定输出的WAV…

算法练习第19天|222.完全二叉树的节点个数

222.完全二叉树的节点个数 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/count-complete-tree-nodes/description/ 题目描述&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。题目数据保…

【Python】穿越Python的迭代之旅:while,for 循环的奇妙世界

欢迎来到CILMY23的博客 本篇主题为&#xff1a; 穿越Python的迭代之旅&#xff1a;while&#xff0c;for 循环的奇妙世界 个人主页&#xff1a;CILMY23-CSDN博客 系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&…

spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless

概述 redis的注解使用的过程中总会遇到condition和unless这两个属性&#xff0c;而且不同的注解使用注意事项不一样。本人也是错误使用之后详细查询了一下&#xff0c;作了如下的总结。 Cacheale 这个注解的使用和意义这里不多说&#xff0c;可以查看我的其他文档。这里主要说…

【C++】二维数组传参方式

最近刚开始刷剑指offer&#xff0c;刚做到第三题的时候&#xff0c;发现C二维数组的传参方式和C语言略有些不同&#xff0c;所以在这篇博客中&#xff0c;会列出C/C常见的二维数组传参方式。&#xff08;本方式和代码都是基于vs环境所编写&#xff09; 一.C语言二维数组传参方式…

18.读取指定目录下的txt文档时,调用另外一个python文件

1.题目 遍历4K_phone和4K_VR目录下的所有txt文件&#xff0c;并将它们的内容合并到一个名为4k_decoding.txt的文件中。 但是&#xff0c;假设你有一个名为another_script.py的Python文件&#xff0c;你想在合并txt文件之前执行它生成要处理的txt文档。 最后统计完原始的txt文件…

算法与数据结构要点速学——通用 DS/A 流程图

通用 DS/A 流程图 这是一个流程图&#xff0c;可以帮助您确定应该使用哪种数据结构或算法。请注意&#xff0c;此流程图非常笼统&#xff0c;因为不可能涵盖每个场景。 请注意&#xff0c;此流程图仅涵盖 LICC 中教授的方法&#xff0c;因此排除了像 Dijkstra 等更高级的算法。…

eclipse配置SVN和Maven插件

3、 安装SVN插件 使用如下方法安装 Help–Install New Software 注意&#xff1a;目前只能安装1.8.x这个版本的SVN&#xff0c;如果使用高版本的SVN&#xff0c;在安装SVN和maven整合插件的时候就会报错&#xff0c;这应该是插件的bug。 点击Add name: subclipse location…

区块链知识总结——比特币中的密码学原理

比特币中的密码学原理&#xff1a; 比特币的本质&#xff1a;crypto-currency. 比特币用到密码学中的两个功能&#xff1a; 1.哈希函数&#xff08;cryptographic hash function&#xff09; 三个重要性质&#xff1a; &#xff08;1&#xff09;抗碰撞性collison resista…

3 xgboost

目录 1 定义 1.1 模型定义 1.2 损失函数 1.3 化简损失函数 xgboost比赛以及工程利器。目前存在大量有关算法文档。 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种基于决策树集成的机器学习算法&#xff0c;被广泛应用于分类、回归和排名等任务。XGBoost…

vue快速入门(三十)vue的工程化开发安装配置

步骤很详细&#xff0c;直接上教程 上一篇 新增内容 安装nodejs安装脚手架工具安装vue项目运行项目服务退出项目服务 安装nodejs 没安装的友友可以参考这位大神的博文Node.js下载安装及环境配置教程【超详细】 安装脚手架工具 打开管理员cmd 输入此命令行npm i -g vue/cli …

access多表关联提示:语法错误(操作符丢失)在查询表达式中

在access数据库中执行多表关联时提示了一个错误 select * from Patient a inner join BioMain b on a.BioIDb.BioID inner join BioResult c on b.BioIDc.BioID where len(a.PatientID)>12 and b.AddTime>#2024-04-17 05:53:23# and b.AddTime<#2024-04-17 17:53:23#…

ASP.NET基于Web Mail收发系统设计与开发

摘 要 互联网络技术的不断发展&#xff0c;电子邮件服务已经成为人们基本的信息交互手段&#xff0c;也是网络服务中最早和最基本的服务之一。传统邮件系统大多是基于C/S结构&#xff0c;如Lotus notes、Microsoft Exchange Server等&#xff0c;这些邮件系统占用相对较多的服…

【WEEK8】 【DAY3】【DAY4】总览Spring Boot【中文版】

目录 2024.4.17 Wednesday1.总览1.1.先看个速成课&#xff0c;了解大概1.2.SpringBoot入门1.2.1.什么是Spring1.2.2.Spring是如何简化Java开发的1.2.3.什么是SpringBoot 1.3.第一个Spring Boot项目1.3.1.准备工作1.3.2.创建基础项目说明1.3.2.1.使用官方选配下载 2024.4.18 Thu…

libftdi1学习笔记 5 - SPI Nor Flash

目录 1. 初始化 2. CS控制例子 3. 读ID 3.1 制造商 3.2 容量大小 3.3 设置IO类型 3.3.1 setQSPIWinbond 3.3.2 setQSPIMxic 3.3.3 setQSPIMicrochip 3.3.4 setQSPIMicron 4. 写保护 5. 等待空闲 6. 擦除扇区 7. 页编程 8. 页读 9. 写 10. 读 11. 验证 基于M…

管理能力学习笔记五:识别团队角色,因才施用

识别团队角色&#xff0c;因才施用&#xff0c;需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好&#xff0c;而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才&#xff0c;才能高效配合…

【Linux】引导过程与服务控制

目录 一、Linux操作系统引导过程 1.linux开机引导过程 2.系统初始化进程 1.init进程 2.进程启动方式 二、运行级别和Systemd单元类型 1.运行级别 2.Systemd 三、启动类故障恢复 1.修复MBR扇区故障 2.修复GRUB引导故障 3.root密码忘记的修改方式 四、系统服务控制 …

初识ansible服务及ansible主机清单配置

目录 1、什么是自动化批量管理 2、自动化工具ansible架构 3、ansible服务专用术语对照表 4、设置主机清单&#xff08;inventory&#xff09; 4.1实验环境准备 4.2配置主机清单 4.2.1分组基本格式 4.2.2指定用户名&#xff0c;密码。端口 4.2.3子组 4.3查看 4.3.1看…

基于SpringBoot+Vue的服装销售商城系统(源码+文档+包运行)

一.系统概述 顺应互联网发展的时代热潮&#xff0c;着力于服装电商&#xff0c;满足消费者的日常需求的同时解决传统服装销售的难题。商家如果还用之前的只有线下卖衣服&#xff0c;已经很落伍了&#xff0c;这样会导致了效率低下。而且&#xff0c;时间一长的话&#xff0c;积…