对不起有些疯狂的主题。
我想覆盖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
答案 0 :(得分:3)
对于实际信号,在这种情况下最好是信号。
您可以使用post_save()
信号,并在侦听器中检查当前模型实例是否存在credit_set,如果不存在,则创建一个。 这将是我的选择 - 没有必要过度这么简单的任务。
当然,如果您真的需要确切知道模型何时启动(我怀疑它),请使用post_init()
信号。您不需要重写save()方法只是为了设置一些额外的变量。只需抓住post_init()
信号或pre_save()
,只需更改/添加您想要的内容即可。恕我直言,没有意义覆盖save()
方法并检查这是否是新实例 - 这就是信号存在的原因。