利用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发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python的pycurl包用法简介
Nov 13 Python
Python+Wordpress制作小说站
Apr 14 Python
python基本语法练习实例
Sep 19 Python
详解python 注释、变量、类型
Aug 10 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
Python+selenium点击网页上指定坐标的实例
Jul 05 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
Python基础之条件语句详解
Jun 16 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
使用 php4 加速 web 传输
2006/10/09 PHP
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
JS跨域问题详解
2014/11/25 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
vue下载二进制流图片操作
2020/10/26 Javascript
在漏洞利用Python代码真的很爽
2007/08/26 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
python实现微信防撤回神器
2019/04/29 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
舞蹈毕业生的自我评价
2014/03/05 职场文书
社团活动总结
2014/04/28 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL