利用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调用zxing库生成二维码图片详解
Jan 10 Python
python 内置函数汇总详解
Sep 16 Python
python关闭占用端口方式
Dec 17 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
python中安装django模块的方法
Mar 12 Python
python判断正负数方式
Jun 03 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
实战Python爬虫爬取酷我音乐
Apr 11 Python
使用Python通过企业微信应用给企业成员发消息
Apr 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
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python常见排序算法基础教程
2017/04/13 Python
Python中单例模式总结
2018/02/20 Python
在python shell中运行python文件的实现
2019/12/21 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
比利时家具购买网站:Home24
2019/01/03 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
总经理职责范文
2013/11/08 职场文书
结构工程个人自荐信范文
2013/11/30 职场文书
高一新生军训感言
2014/03/02 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
银行授权委托书格式
2014/10/10 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
追讨欠款律师函
2015/06/24 职场文书