保存模型后调用函数
我正在开发一个连接到LDAP服务器的Django应用。这里有个我想实现的功能。
我有一个叫做system的模型,用来存储一些关于电脑的信息。当我添加一个新的system时,这个模型会生成一个独特的UUID,类似于自动编号的字段。关键是这个参数是在保存的时候生成的,而且只在第一次保存时生成。
保存后,我需要一个函数来保留这个UUID,并在我的LDAP上创建一个新对象。
因为我对信号(signals)了解不多,所以我尝试通过重写模型的保存函数来实现这个功能:
def save(self):
# import needed modules
import ldap
import ldap.modlist as modlist
[--OPERATIONS ON THE LDAP--]
super(System, self).save()
这样一来,如果我修改一个已经存在的system,一切都能正常工作,因为它的UUID已经生成了。但是如果我尝试添加一个新的system,我就会遇到错误,提示UUID是None,我无法在LDAP中使用一个空的变量(而且这样也没什么用,不是吗?)
看来我需要在system被保存之后调用处理LDAP的函数,这样UUID才会被生成。我尝试理解如何创建一个post_save函数,但没能搞明白。
我该怎么做呢?
谢谢
2 个回答
信号在这种情况下会非常好用,不过把 super(System, self).save()
这行代码放到保存方法的最上面也可能有效。这意味着你首先保存这个实例,然后再把保存好的对象传给LDAP。
正如你自己所说的,你确实需要信号,这样可以让你的代码更整洁,并且可以把不同部分的逻辑分开。
通常的做法是在你的模型文件的最后放置信号:
# Signals
from django.dispatch import receiver
@receiver(models.signals.post_save, sender=YourModel)
def do_something(sender, instance, created, **kwargs):
....
在上面的例子中,我们把 post_save 信号和 do_something 函数连接起来,这个连接是通过一个叫 @receiver 的装饰器来实现的,装饰器的发送者指向你的模型类。在你的函数内部,有一个 instance,它代表当前的模型实例,还有一个 created 标志,可以让你判断这是一个新记录还是旧记录(如果模型正在被更新的话)。