利用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动态监控日志内容的示例
Feb 16 Python
给Python IDLE加上自动补全和历史功能
Nov 30 Python
浅谈Python中copy()方法的使用
May 21 Python
python保存字符串到文件的方法
Jul 01 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
python读取图片任意范围区域
Jan 23 Python
python+mysql实现教务管理系统
Feb 20 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 Python
Python面向对象原理与基础语法详解
Jan 02 Python
python读取ini配置的类封装代码实例
Jan 08 Python
关于python中的xpath解析定位
Mar 06 Python
Python Parser的用法
May 12 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Python之os操作方法(详解)
2017/06/15 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
解决python flask中config配置管理的问题
2019/07/26 Python
python解释器spython使用及原理解析
2019/08/24 Python
python类的实例化问题解决
2019/08/31 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
对公司合理化的建议书
2014/03/12 职场文书
企业文化理念标语
2014/06/10 职场文书
创先争优个人承诺书
2014/08/30 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
行为规范主题班会
2015/08/13 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP