在django模型中发布创建实例代码调用

时间:2010-09-24 15:13:20

标签: django django-models

对不起有些疯狂的主题。

我想覆盖django模型的save方法,并在新创建模型实例时调用一些额外的代码。 当然我可以使用信号或检查模型是否有空的pk字段,如果是,则创建临时变量,然后调用代码:

Class EmailModel(models.Model):
    email = models.EmailField()

    def save(self, *args, **kwargs)
        is_new = self.pk is None
        super(EmailModel, self).save(*args, **kwargs)
        # Create necessary objects
        if is_new:
            self.post_create()

    def post_create(self):
          # do job, send mails
          pass

但我喜欢使用一些漂亮的代码并避免在save方法中使用临时变量。 所以问题是:是否有可能在超级save_base父方法调用之后找到模型实例是否是新创建的对象?

我检查过Django来源无法找到正确的方法。

由于

我们有related post

1 个答案:

答案 0 :(得分:3)

对于实际信号,在这种情况下最好是信号。

您可以使用post_save()信号,并在侦听器中检查当前模型实例是否存在credit_set,如果不存在,则创建一个。 这将是我的选择 - 没有必要过度这么简单的任务。

当然,如果您真的需要确切知道模型何时启动(我怀疑它),请使用post_init()信号。您不需要重写save()方法只是为了设置一些额外的变量。只需抓住post_init()信号或pre_save(),只需更改/添加您想要的内容即可。恕我直言,没有意义覆盖save()方法并检查这是否是新实例 - 这就是信号存在的原因。