利用django model save方法对未更改的字段依然进行了保存


Posted in Python onMarch 28, 2020

我就废话不多说了,直接上代码吧!

obj = Obj.objects.get(id=1)
print obj.name #此时name的值假定为'abc'
 
def handler(oid):
 obj = Obj.objects.get(id=oid)
 obj.name = '123'
 obj.save()
handler(obj.id)
obj.age = 10
obj.save()
print obj.name

最终的name结果依然为'abc'。save()保存时,虽然没有更改其它字段,但依然会将内存中的值,再次存入数据库,子函数和其它进程更改的值会被覆盖。

补充知识:Django Signals之pre_save & post_save ,pre_delete & post_delete

Listening to signals(信号监听)

To receive a signal, register a receiver function using the Signal.connect() method. The receiver function is called when the signal is sent.

(为了接收信号,需要使用Signal.connect()方法注册一个接收器函数,当信号发送后接收器函数就会被调用)

Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)[source]

Parameters: 参数解析

receiver ? The callback function which will be connected to this signal. See Receiver functions for more information.

sender ? Specifies a particular sender to receive signals from. See Connecting to signals sent by specific senders for more information.

weak ? Django stores signal handlers as weak references by default. Thus, if your receiver is a local function, it may be garbage collected. To prevent this, pass weak=False when you call the signal's connect() method.

dispatch_uid ? A unique identifier for a signal receiver in cases where duplicate signals may be sent. See Preventing duplicate signals for more information.

一般使用是这样的:

def my_callback(sender, **kwargs):
 print("Request finished!")

#Connecting receiver functions(连接接收器函数)
#There are two ways you can connect a receiver to a signal. You can take the manual connect route:

from django.core.signals import request_finished

request_finished.connect(my_callback)

当然,喜欢装逼(高技术)的人喜欢使用另外一种方式,receiver()装饰器:

receiver(signal)[source]#用法
Parameters: signal ? A signal or a list of signals to connect a function to.

下面将针对本文标题来做示例:

django.db.models.signals.pre_save & django.db.models.signals.post_save

Sent before or after a model's save() method is called.

在模型保存操作执行前或者执行后发送信号

Connecting to signals sent by specific senders

(连接到特定发送器发送的信号)

Some signals get sent many times, but you'll only be interested in receiving a certain subset of those signals. For example, consider the django.db.models.signals.pre_save signal sent before a model gets saved. Most of the time, you don't need to know when any model gets saved ? just when one specific model is saved.

(有些信号会被多次发送,但是我们通常只是对其中的一些信号子集感兴趣,下面将演示针对具体的某个模型的pre_save以及post_save来发送信号)

利用django model save方法对未更改的字段依然进行了保存

从上边的运行结果可以看出,两个函数都被执行了,但是是有一定的执行顺序的,pre then post

In these cases, you can register to receive signals sent only by particular senders. In the case of django.db.models.signals.pre_save, the sender will be the model class being saved, so you can indicate that you only want signals sent by some model:

django.db.models.signals.pre_delete & django.db.models.signals.post_delete

Sent before or after a model's delete() method or queryset's delete() method is called.

在模型删除操作执行前或者执行后发送信号

下面将演示pre_delete与post_delete这两个模型信号的使用

利用django model save方法对未更改的字段依然进行了保存

和save的运行逻辑一样,pre信号先触发,post后触发

以上这篇利用django model save方法对未更改的字段依然进行了保存就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
Python优先队列实现方法示例
Sep 21 Python
python递归函数绘制分形树的方法
Jun 22 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
Python实现的各种常见分布算法示例
Dec 13 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
详解js文件通过python访问数据库方法
Mar 03 Python
python实现的读取网页并分词功能示例
Oct 29 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
Python常用数据分析模块原理解析
Jul 20 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 #Python
关于python 跨域处理方式详解
Mar 28 #Python
对python中各个response的使用说明
Mar 28 #Python
基于Django signals 信号作用及用法详解
Mar 28 #Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 #Python
Django 实现对已存在的model进行更改
Mar 28 #Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 #Python
You might like
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
让的PHP代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
利用python如何处理nc数据详解
2018/05/23 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
allbeauty美国:英国在线美容店
2019/03/11 全球购物
长辈证婚人证婚词
2014/01/09 职场文书
质量提升方案
2014/06/16 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
个人租房协议书
2014/11/28 职场文书
张思德观后感
2015/06/09 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
Python入门之基础语法详解
2021/05/11 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server