利用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中使用Boolean操作符做真值测试实例
Jan 30 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Django在win10下的安装并创建工程
Nov 20 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
学生信息管理系统Python面向对象版
Jan 30 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
在Python中字典按值排序的实现方法
Nov 12 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
PHP 断点续传实例详解
2017/11/11 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
Python中字典和JSON互转操作实例
2015/01/19 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python实现密码薄文件读写操作
2019/12/16 Python
Python自带的IDE在哪里
2020/07/01 Python
如何教少儿学习Python编程
2020/07/10 Python
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
会计专业应届生求职信
2013/11/24 职场文书
市场部专员岗位职责
2013/11/30 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
质量负责人岗位职责
2015/02/15 职场文书
交通事故被告答辩状
2015/05/22 职场文书
门球健将观后感
2015/06/16 职场文书
小学毕业感言100字
2015/07/30 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书