python - 保存模型后调用函数

标签 python django django-models django-signals

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

我有一个名为系统 的模型,其中包含一些有关计算机的信息。当我添加一个新的系统时,该模型会生成一个唯一的 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 为 None,并且我无法在 LDAP 上使用空变量(它也没有用,你不这么认为吗?)

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

谢谢

最佳答案

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

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

# 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 标志,它允许您确定这是新记录还是旧记录(如果模型正在更新中)。

关于python - 保存模型后调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529351/

相关文章:

Python 文档 ( :obj :`str` ) vs (str)

python - 将格子转化为图?

javascript - 通过ajax从django查询集中填充下拉列表

django - 如何使用 Django 中的迁移和数据向现有 ManyToManyField 添加直通选项

python - Pandas Plot 按时间分组的条形图

python - 如何修改 matplotlib 定性颜色图中的间隔?

python - Django "remove hardcoded urls in templates"不工作

python - 传递参数后如何在模板中的元素中创建id?

python - 使用 Django 通过模型字段定义 ManyToManyField 的顺序

python - 如何过滤 django-queryset 中带注释的数据