利用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获取Linux系统的各种信息
Jul 10 Python
详解Python程序与服务器连接的WSGI接口
Apr 29 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
Python闭包执行时值的传递方式实例分析
Jun 04 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
python 自动轨迹绘制的实例代码
Jul 05 Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 Python
PyCharm 光标变成黑块的解决方式
Feb 06 Python
python 求两个向量的顺时针夹角操作
Mar 04 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.ini中文版(1)
2006/10/09 PHP
图书管理程序(三)
2006/10/09 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
Dom与浏览器兼容性说明
2010/10/25 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
JS中的作用域链
2017/03/01 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
Vue基础配置讲解
2019/11/29 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python语言的变量认识及操作方法
2018/02/11 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
Python虚拟环境venv用法详解
2020/05/25 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
妇女儿童发展规划实施方案
2014/03/16 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
写给医生的感谢信
2015/01/22 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android