DRF 序列化类保存save源码

news2024/10/6 10:28:15

【七】序列化保存save源码

【1】介绍

  • 无论是创建还是修改数据,都需要执行save方法,再前面的使用中都没有再里面添加过参数
    • 其实save中可以给额外参数
    • 比如.save(time=datetime.datetime.now())
    • 这个需要模型表中有time的字段,结果就是将当前时间也保存在表中,不用经过数据校验

【2】需要的基础知识

(1)assert

  • assert 是 Python 中用于调试的一个关键字,它允许程序员在代码中设置检查点,以确保程序在运行时满足特定的条件。
    • 如果条件为真(True),则 assert 语句不会做任何事情,程序将继续执行。
    • 如果条件为假(False),assert 会引发一个 AssertionError 异常,通常还伴随着一个可选的错误消息,用于解释断言失败的原因。

(2)反射方法hastattr

  • hasattr 是 Python 的内置函数,用于检查对象是否具有特定的属性。

    • 这个函数接受两个参数:一个对象和一个字符串,该字符串表示要检查的属性名。
    • 如果对象具有该属性,hasattr 返回 True;否则,返回 False
  • 详情请见:Python 面向对象之反射_python对象反射-CSDN博客

(3)示例

class A:
    class_name = "A"

try:
    a = A()
    assert hasattr(a, 'class_name'), ('Don`t have class_name')
    assert hasattr(a, 'name'), ('Don`t have name')
except Exception as e:
    print(e)

# Don`t have name
  • 最外层用try来捕获异常,如果发现了异常那么就执行异常的输出print(e)
    1. 首先实例化一个对象a
    2. 然后使用两个断言,每个断言的前面是一个反射方法,对实例a进行属性的判断,
      • 在返回True,那么就不会执行断言后面的参数;
      • 不在返回False,那么会返回后面的报错描述信息

【3】分析源码

  • 这是序列化类的save方法源码
def save(self, **kwargs):
    assert hasattr(self, '_errors'), (...)
    assert not self.errors, (...)
    assert 'commit' not in kwargs, (...)
    assert not hasattr(self, '_data'), (...)

    validated_data = {**self.validated_data, **kwargs}

    if self.instance is not None:
        self.instance = self.update(self.instance, validated_data)
        assert self.instance is not None, ()
    else:
        self.instance = self.create(validated_data)
        assert self.instance is not None, ()

    return self.instance

image-20240414221839421

  • 首先执行了四个断言

    1. hasattr(self, '_errors'):检查对象是否有 _errors 属性。这个属性是在 .is_valid() 后设置的,如果没有说明没进行反序列化检查
    2. assert not self.errors:检查对象errors属性是否为空。有值说明数据检验不通过
    3. 'commit' not in kwargs防止用户错误地传递 'commit' 参数给 save() 方法,并提示用户正确的使用方式。
    4. not hasattr(self, '_data'):这个断言确保在访问 serializer.data 属性之后没有调用 .save() 方法。访问 serializer.data 通常意味着序列化器的数据已经被渲染成输出格式(如 JSON),此时再调用 .save() 可能会导致不一致或错误的状态
  • 重点来了validated_data = {**self.validated_data, **kwargs}

    • 首先validated_data这个是通过校验的所有数据,是普通的字典格式(querydict就不是普通字典格式),普通字典格式可以使用**进行打散,即{"name":"bruce"}将变成name=bruce,打散放在字典中
    • kwargs是就是我们自定义传进来的信息,同样的进行打散,放在通过校验的数据中,所以我们可以直接在save方法中进行传值
  • 接下来就是进行实例instance的判断

    • 没有实例instance,说明是创建实例,即调用create方法
    • 有实例instance,说明就是要修改操作,即调用update方法
  • 创建或修改完成后,同样通过断言 assert self.instance is not None, () 确保 self.instance 不是 None

    • 这也是一个安全检查,确保创建操作成功返回了一个实例。

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

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

相关文章

【YOLOv5】利用Kaggle的GPU训练(运行)yolov5模型(项目)

文章目录 (一)下载YOLOv5源码(二)修改YOLOv5源码1、修改输出文件的保存路径(适应Kaggle的输出路径)2、在data文件夹中新建一个yaml文件3、在 train.py 中修改data路径4、指定训练的轮数5、修改模型配置文件…

C语言 | Leetcode C语言题解之第38题外观数列

题目&#xff1a; 题解&#xff1a; class Solution { public:string countAndSay(int n) {string s "1", ans "1";for (int i 2; i < n; i) {ans "";for (int j 0; j < int(s.size()); ) {int k j;while(k < int(s.size()) &am…

使用yolov8 进行实例分割训练

1、基于windows 的ISAM标注 直接下载安装包&#xff0c;解压后即可使用 链接&#xff1a;https://pan.baidu.com/s/1u_6jk-7sj4CUK1DC0fDEXQ 提取码&#xff1a;c780 2、标注结果转yolo格式 通过ISAM标注后的json文件路径 原始json格式如下&#xff1a; ISAM.json 转 yolo.…

[阅读笔记1][GPT-3]Language Models are Few-Shot Learners

首先讲一下GPT3这篇论文&#xff0c;文章标题是语言模型是小样本学习者&#xff0c;openai于2020年发表的。 这篇是在GPT2的基础上写的&#xff0c;由于GPT2还存在一些局限&#xff0c;这篇对之前的GPT2进行了一些完善。GPT2提出了多任务学习&#xff0c;也就是可以零样本地用在…

深入剖析跨境电商平台风控机制,探索测评安全与稳定的秘诀

在跨境电商测评市场鱼龙混杂的当下&#xff0c;测评过程中可能隐藏的陷阱保持高度警觉。多年的测评经验告诉我们&#xff0c;选择一个适合的测评系统对于项目的成功至关重要。近年来&#xff0c;测评技术如雨后春笋般涌现&#xff0c;市场上涌现出众多测评系统&#xff0c;覆盖…

SQL-Oracle 获取最大值,第二大,第三大,第 N 大值

目录 1、原始数据2、获取最大值记录3、获取第二大值记录4、获取第三大值记录 1、原始数据 select * from test_2024_04_15_001 order by 销量 desc,渠道2、获取最大值记录 select 渠道,销量 from ( select a.渠道, a.销量 from test_2024_04_15_001 a order by a.销量 desc,…

Pytorch实用教程:nn.CrossEntropyLoss()的用法

在 PyTorch 中&#xff0c;nn.CrossEntropyLoss() 是一个非常常用且功能强大的损失函数&#xff0c;特别适合用于多类分类问题。这个损失函数结合了 nn.LogSoftmax() 和 nn.NLLLoss() (Negative Log Likelihood Loss) 两个操作&#xff0c;从而在一个模块中提供完整的交叉熵损失…

Spring Boot与Vue联手打造前沿智能学习平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种&#xff0c;不同的插件对应了不同的调试方法&#xff0c;比如&#xff1a; 1.C/C插件进行GDB调试(编写launch.json文件) 2.C/C Runner插件 3.CMake Tools插件&#xff08;只针对CMake工程&#xff0c;需要搭配C/C插件一起使用&#xff0c;但无…

【系统分析师】系统测试与维护

文章目录 1、测试方法2、测试阶段3、面向对象的测试4、测试自动化5、软件调试6、软件评审7、软件改进过程8、软件开发环境与工具9、系统转换计划10、系统的运行与维护11、系统审计 1、测试方法 例题 2、测试阶段 注意区分:每个阶段都做了什么事情3、面向对象的测试 4、测试自动…

设计模式之模板方法模式详解(下)

3&#xff09;钩子方法的使用 1.概述 钩子方法的引入使得子类可以控制父类的行为。 2.结构图 3.代码实现 将公共方法和框架代码放在抽象父类中 abstract class DataViewer {//抽象方法&#xff1a;获取数据public abstract void GetData();//具体方法&#xff1a;转换数据…

【传输层】

文章目录 传输层传输服务和协议传输层 vs. 网络层Internet传输层协议多路复用/解复用在发送方主机多路复用在接收方主机多路解复用 多路解复用工作原理无连接&#xff08;UDP&#xff09;多路解复用无连接传输&#xff1a;UDPUDP&#xff1a;用户数据报协议UDP校验和 传输层 目…

华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎受邀为PMO大会演讲嘉宾

全国PMO专业人士年度盛会 华为服务Fellow、首席项目管理专家&#xff0c;华为H5M项目管理标准制定主导者孙虎先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“落地项目管理标准&#xff0c;打赢班长的战争”。大会将于5月25-26日在北京举办&am…

excel中vlookup查找值必须在table_array的第一列,有其他办法吗有XLOOKUP

vlookup查找值必须在table_array的第一列&#xff0c;有其他办法吗&#xff1f;有XLOOKUP。 vlookup 查找如下&#xff0c;查找值必须在table_array的第一列 如果下面&#xff0c;编码和名称交换位置&#xff0c;就不能使用vlookup查找了。 XLOOKUP 查找如下

电脑桌面便签软件哪个好?好用的电脑桌面便签

电脑作为我们日常工作的重要工具&#xff0c;承载着大量的任务和项目。当工作任务繁重时&#xff0c;如何在电脑桌面上高效管理这些任务就显得尤为重要。这时&#xff0c;选择一款优秀的桌面便签软件&#xff0c;无疑会给我们带来极大的便利。 一款好的桌面便签软件&#xff0…

注意力机制基本思想(一)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客&#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实战…

2024年华中杯B题论文发布+数据预处理问题一代码免费分享

【腾讯文档】2024年华中杯B题资料汇总 https://docs.qq.com/doc/DSExMdnNsamxCVUJt 行车轨迹估计交通信号灯周期问题 摘要 在城市化迅速发展的今天&#xff0c;交通管理和优化已成为关键的城市运营问题之一。本文将基于题目给出的数据&#xff0c;对行车轨迹估计交通信号灯…

记录Python链接mysql的数据库的2种操作方式

一、使用pymysql库方式 import pymysqldb pymysql.connect(hostlocalhost,userroot,password123456) #创建链接&#xff0c;在3.8以后好像已经不支持这个种链接方式了&#xff0c; #db pymysql.connect(localhost,root,123456) cursor db.cursor()#拿到游标这样我们就拿到了…

Rust 语言 GUI 用户界面框架汇总(持续更新)

拜登&#xff1a;“一切非 Rust 项目均为非法”&#x1f60e; 什么是 GUI 图形用户界面&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形用户接口&#xff09;是指采用图形方式显示的计算机操作用户界面。 现在的应用开发&#xff0c;是既要功…

云从科技AI智能体云月亮相中国铁建GSF项目展示中心

近日&#xff0c;中国铁建大湾区科学论坛永久会址项目综合展示体验中心&#xff08;以下简称“中国铁建GSF项目展示中心”&#xff09;迎来了一位特别的客服——云月数智人。云月是云从从容多模态大模型的融合承载体——AI智能体&#xff08;AI-Agent&#xff09;&#xff0c;她…