Django:模型__init __()在每次更新时调用

时间:2011-06-30 15:28:12

标签: python django

我的一个模特中有一个相当神秘的问题。我已覆盖__init__,如下所示:

class Program(models.Model)
    ...
    def __init__(self, *args, **kwargs):
        super(Program, self).__init__(*args, **kwargs)
        for m in Milestone.objects.all():
            try:
                ProgramMilestone.objects.create(milestone = m, program = self)
            except IntegrityError: # The link already exists.
                pass

其中ProgramMilestone是through='...'Milestone之间的链接表(使用Program)。

我希望所有Milestones仅在程序创建时添加到Program,但是现在每当我在Django的管理界面中打开程序时,它都会运行for m...循环(因此无法删除Django admin中的任何ProgramMilestone个对象,因为它们只会在刷新时重新生成。)

我是否误解了__init__的作用,如果是,我该如何创建这种行为(即只在实例化时运行的一次性代码)?

3 个答案:

答案 0 :(得分:8)

如果我找到了你,你想在创建程序时运行一些代码。

您可以使用post_save信号并检查created标志。

https://docs.djangoproject.com/en/dev/ref/signals/#post-save

通过让您的代码收听该信号,您可以在创建程序时运行代码,而不是更改。

答案 1 :(得分:3)

只要创建了内存中的Program对象,就会调用__init__方法。当您从数据库中读取程序时,以及您真正在磁盘上创建新程序对象的时间,就会发生这种情况。

答案 2 :(得分:2)

实例化。实例化是指从头开始或使用数据库中的值创建Python对象的时候。

您可能希望覆盖save方法 - 在您的版本中,如果self.pk为None,则设置标志,调用超级类save,然后运行代码,如果标志是集。