利用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进阶教程之文本文件的读取和写入
Aug 29 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
Python分治法定义与应用实例详解
Jul 28 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 Python
python实现控制台输出彩色字体
Apr 05 Python
python else语句在循环中的运用详解
Jul 06 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
Dojo 学习要点
2010/09/03 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
python时间序列按频率生成日期的方法
2019/05/14 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
Java的基础面试题附答案
2016/01/10 面试题
学生会离职感言
2014/02/11 职场文书
期终自我鉴定
2014/02/17 职场文书
新闻发布会主持词
2014/03/28 职场文书
服务之星事迹材料
2014/05/03 职场文书
工地安全标语
2014/06/07 职场文书
优秀员工评优方案
2014/06/13 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python