利用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将mdb数据库文件导入postgresql数据库示例
Feb 17 Python
python进阶教程之函数对象(函数也是对象)
Aug 30 Python
python对数组进行反转的方法
May 20 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Python如何生成树形图案
Jan 03 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
python函数与方法的区别总结
Jun 23 Python
django 微信网页授权登陆的实现
Jul 30 Python
python中的逆序遍历实例
Dec 25 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
python主要用于哪些方向
Jul 05 Python
Python 远程开关机的方法
Nov 18 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概述.
2006/10/09 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
书香家庭事迹材料
2014/05/09 职场文书
项目建议书模板
2014/05/12 职场文书
运动会的口号
2014/06/09 职场文书
主持稿开场白
2015/06/01 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
MySQL实现配置主从复制项目实践
2022/03/31 MySQL