保存模型后调用函数

时间:2014-08-27 14:07:27

标签: python django django-models django-signals

我正在处理连接到LDAP服务器的Django应用程序。这就是我试图做的伎俩。

我有一个名为 system 的模型,其中包含有关计算机的一些信息。当我添加一个新的系统时,该模型会生成一个唯一的UUID,如和AutoField。 重点是保存时会生成此参数,而且只是第一次生成 保存后,我需要一个函数来保留该UUID并在我的LDAP上创建一个新对象 由于我对信号知之甚少,我尝试以这种方式覆盖模型保存功能:

def save(self):

        # import needed modules
        import ldap
        import ldap.modlist as modlist

        [--OPERATIONS ON THE LDAP--]

        super(System, self).save()

通过这种方式,如果我修改现有的系统,所有工作都应该如此,因为它已经生成了UUID。但是,如果我尝试添加一个新的系统,我发现错误UUID是无,我无法使用LDAP上的空变量(也是没用的,不要认为所以?)

似乎我需要在保存 system 之后调用在上工作的函数,因此在生成UUID之后。我试图了解如何创建post_save函数,但我无法得到它 我怎么能这样做?

由于

2 个答案:

答案 0 :(得分:1)

正如您自己所说,您确实需要信号,这将使您的代码保持更清洁,并在各部分之间分离逻辑。

通常的做法是将信号放在模型文件的末尾:

# 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 执行的,装饰器的发送者指向您的模型类。 在您的函数内部,您有实例,它包含模型的当前实例和创建的标志,该标志允许您确定这是新记录还是旧记录(如果模型正在更新)。

答案 1 :(得分:0)

这样的信号非常好,但将行super(System, self).save()移到save方法的顶部也可以。这意味着在将保存的对象传递给LDAP之前,首先要保存实例。