Django:每次更新都会调用 Model __init__()吗?

1 投票
3 回答
5201 浏览
提问于 2025-04-16 20:36

我在我的一个模型中遇到了一个相当让人困惑的问题。我重写了 __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 是一个连接表,用来连接 MilestoneProgram

我希望所有的 Milestones 只在创建 Program 的时候被添加,但现在每当我在 Django 的管理界面打开 Program 时,它都会运行 for m... 循环(这使得在 Django 管理界面中无法删除任何 ProgramMilestone 对象,因为刷新后它们会被重新创建)。

我是不是误解了 __init__ 的作用?如果是的话,我该如何实现这种行为(也就是只在实例化时运行的代码)?

3 个回答

2

这就是实例化。实例化就是在Python中创建一个对象,可以是从头开始创建,也可以是用数据库中的值来创建。

你可能想要重写一下save方法。在你的版本中,如果self.pk是None,就设置一个标志,然后调用父类的save方法,最后如果标志被设置,就运行你的代码。

3

__init__ 方法是在每次创建一个内存中的程序对象时被调用的。这种情况发生在你从数据库读取程序的时候,以及你真正要在磁盘上创建新的程序对象的时候。

9

如果我理解没错的话,你是想在一个程序被创建的时候运行一些代码。

你可以使用 post_save 信号,并检查一下 created 标志。

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

通过让你的代码监听这个信号,你就可以在每次创建一个程序的时候运行你的代码,而不是在程序被修改的时候。

撰写回答