【问题标题】:Call a function after saving a model保存模型后调用函数
【发布时间】:2014-10-21 04:01:38
【问题描述】:

我正在开发一个连接到 LDAP 服务器的 Django 应用程序。这是我正在尝试做的技巧。

我有一个名为 system 的模型,其中包含一些关于计算机的信息。当我添加一个新的 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 已经生成。但是,如果我尝试添加一个新的 system,我发现错误 UUID 为 None,并且我无法在 LDAP 上使用空变量(这也是没用的,你不这么认为吗?)

似乎我需要在系统保存之后调用在LDAP上工作的函数,因此在生成UUID之后。我试图不了解如何创建 post_save 函数,但我无法获得它。
我该怎么做?

谢谢

【问题讨论】:

    标签: python django django-models django-signals


    【解决方案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 执行的,装饰器的发送者指向您的模型类。 在您的函数中,您有 instance 保存模型的当前实例和 created 标志,它允许您确定这是新记录还是旧记录(如果模型正在更新中)。

    【讨论】:

    • 所以我想我可以使用 instance.attribute 来调用一些特定属性,就像 self.attribute 一样,或者还有另一种调用方式他们?
    • 没错,instance 就是你的模型实例,就像模型类中的 self 一样 :)
    【解决方案2】:

    信号对于这样的事情非常有用,但是将行 super(System, self).save() 移动到保存方法的顶部也可能会起作用。这意味着您首先保存实例,然后将保存的对象传递给 LDAP。

    【讨论】:

    • 比你。其实我试过你的建议,我必须说它有效!但我更喜欢实现一个 post_save 函数,以便划分操作部分,并保持代码整洁。
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 2015-10-16
    • 2018-08-07
    • 2012-11-11
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多