【问题标题】:Post create instance code call in django models在 django 模型中发布创建实例代码调用
【发布时间】:2011-04-16 20:23:31
【问题描述】:

对不起,有些疯狂的主题。

如果模型实例是新创建的,我想覆盖 django 模型的保存方法并调用一些额外的代码。 当然我可以使用信号或检查模型是否有空的 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

但我喜欢有一些漂亮的代码,并避免在保存方​​法中使用临时变量。 那么问题来了:是否可以在 super save_base 父方法调用后发现模型的实例是否是新创建的对象?

我检查了 django 资源,找不到正确的方法。

谢谢

我们有related post

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    对于真实 - 在这种情况下,信号是最好的方法。

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

    当然,如果您真的需要确切知道模型何时启动(我对此表示怀疑),请使用post_init() 信号。你不需要重写 save() 方法来设置一些额外的变量。只需捕获post_init() 信号或pre_save(),然后更改/添加您想要的。恕我直言,重写 save() 方法并检查这是否是新实例是没有意义的 - 这就是信号存在的原因。

    【讨论】:

    • 我不会同意你的看法。当您在不同的应用程序之间传递数据时,信号很好,但如果操作与模型有直接关系,最好覆盖保存。当您应该同时使用两者时,这是一个很好的解释:martin-geber.com/thought/2007/10/29/…
    • 我不需要“post_init()”。例如,如果创建了新的模型实例,我只是想发送一些邮件。
    • 没有意义将邮件逻辑放入 save() 方法然后:) 回到基础 - 这就是信号的原因。如果你愿意,你可以覆盖 save() 方法。为会计系统添加一些客户自动编号,但不用于发送电子邮件。您可以在捕获的post_save() 信号中使用send_mail() - 在这种情况下,实例和发送者作为参数提供:)
    • 好吧——请解释一下你到底想达到什么目标?你想发送邮件,或者你想创建一些相关的对象或者不同的东西?
    • 一切都很简单 - 避免信号并避免 is_new 附加变量。我想知道该实例是否有一些内部属性可以告诉我它是否是新创建的。
    猜你喜欢
    • 2021-03-09
    • 2013-03-25
    • 2012-04-12
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2019-01-06
    • 2023-03-23
    相关资源
    最近更新 更多