利用django model save方法对未更改的字段依然进行了保存
作者:寒木 发布时间:2021-12-21 21:24:18
我就废话不多说了,直接上代码吧!
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来发送信号)
从上边的运行结果可以看出,两个函数都被执行了,但是是有一定的执行顺序的,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这两个模型信号的使用
和save的运行逻辑一样,pre信号先触发,post后触发
来源:https://blog.csdn.net/zhanglingge/article/details/88031652
猜你喜欢
- python启用多线程后,调用exit出现无法退出的情况,原因是exit会抛出Systemexit的异常,如果在exit外围调用了try,就
- 本文实例讲述了Python单例模式的使用方法。分享给大家供大家参考。具体如下:方法一import threading  
- 本文实例讲述了python网络编程之读取网站根目录的方法,分享给大家供大家参考。具体实现方法如下:import socket, sys po
- 相信很多初学python的小伙伴都会遇到这样的坑:环境变量配置不好,无法正常启动python。那么环境变量究竟是个什么东西呢?为什么要设置它
- 这个类可以用来搜索在给定的文本目录中的文件。 它可以给定目录遍历递归查找某些文件扩展名的文件。 并打开找到的文件,并检查他们是否包含搜索词语
- < % Response.CharSet="gb2312" tblna
- 本文实例讲述了Python上下文管理器类和上下文管理器装饰器contextmanager用法。分享给大家供大家参考,具体如下:一. 什么是上
- 本文实例讲述了python概率计算器实现方法。分享给大家供大家参考。具体实现方法如下:from random import randrang
- 1、涉及到图的对比会用到子图形式展示,先看看效果2、绘制代码如下accuracy_alexnet_clef = [78.05, 78.43,
- Redis数据类型String:二进制安全,可以包含任何数据Hash:一个键值(key=>value)对集合List:简单的字符串列表
- JAN-1(January) FEB-2(February) MAR-3(March)APR-4(April) MAY-5(Ma
- pytorch的dataloader会将数据传到GPU上,这个过程GPU的mem占用会逐渐增加,为了避免GPUmen被无用的数据占用,可以在
- 今天我和中国著名画家"渔人"谈了一个关于"怎样才能设计好"的问题,他给我说了一句话,得益不浅,那句话
- 本文研究的主要是Python的端口扫描程序,具体实例代码如下。先来看看第一个端口扫描程序代码,获取本机的IP和端口号:import sock
- 尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一
- 在Qt中经常需要使用样式,为了降低耦合性(与逻辑代码分离),我们通常会定义一个QSS文件,然后编写各种控件(QLabel,QLIneEdit
- 目录WSGI基本原理1. WSGI处理过程2. WSGI示例3. WSGI web服务器和应用程序WSGI基本原理1. WSGI处理过程浏览
- Paramiko是一个用于执行SSH命令的Python第三方库,使用该库可实现自动化运维的所有任务,如下是一些常用代码的封装方式,多数代码为
- 之一:torchvision 中包含了很多预训练好的模型,这样就使得 fine-tune 非常容易。本文主要介绍如何 fine-tune t
- 本文实例讲述了Python实现计算圆周率π的值到任意位的方法。分享给大家供大家参考,具体如下:一、需求分析输入想要计算到小数点后的位数,计算