Django:每次更新都会调用 Model __init__()吗?
我在我的一个模型中遇到了一个相当让人困惑的问题。我重写了 __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 是一个连接表,用来连接 Milestone
和 Program
。
我希望所有的 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
通过让你的代码监听这个信号,你就可以在每次创建一个程序的时候运行你的代码,而不是在程序被修改的时候。