利用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简单进程锁代码实例
Apr 27 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
python对excel文档去重及求和的实例
Apr 18 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
Python 如何展开嵌套的序列
Aug 01 Python
python 如何区分return和yield
Sep 22 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
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
php实现生成验证码实例分享
2016/04/10 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
用Python设计一个经典小游戏
2017/05/15 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
汽车维修工岗位职责
2014/02/12 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python