利用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解析XML的几种常见方法的介绍
Apr 09 Python
利用Python实现简单的相似图片搜索的教程
Apr 23 Python
Python数据类型之Dict字典实例详解
May 07 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
Python 用turtle实现用正方形画圆的例子
Nov 21 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
python3 配置logging日志类的操作
Apr 08 Python
如何用python插入独创性声明
Mar 31 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
php实现分页显示
2015/11/03 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
使用js 设置url参数
2013/07/08 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
用Python将结果保存为xlsx的方法
2019/01/28 Python
实例讲解Python3中abs()函数
2019/02/19 Python
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
工厂会计员职责
2014/02/06 职场文书
交通工程专业推荐信
2014/09/06 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
keepalived + nginx 实现高可用方案
2022/12/24 Servers