Django - 保存前 VS 保存后 VS 查看保存

Posted

技术标签:

【中文标题】Django - 保存前 VS 保存后 VS 查看保存【英文标题】:Django - pre-save VS post-save VS view save 【发布时间】:2017-09-04 07:41:03 【问题描述】:

我想在更新(已经存在的)对象后执行一些操作(发送电子邮件)。 为了做到这一点,我需要在保存之前和之后比较对象的值,并且只有在特定内容发生变化的情况下 - 执行该操作。通过阅读其他相关问题,我了解到我只能在预保存信号中执行此操作,因为我无法在“保存后”中获取旧版本,但是 - 如果保存时出现问题并且项目将没有得救?在这种情况下,我不想执行该操作。所以我想通过覆盖视图保存以某种方式实现它,但我不确定这是正确的方法。你怎么看? 这是在预保存中实现的:

@staticmethod
@receiver(pre_save, sender=Item)
# check if there is change that requires sending email notification.
def send_email_notification_if_needed(sender, instance, raw, *args, **kwargs):
    try:
        # if item just created - don't do anything
        pre_save_item_obj = sender.objects.get(pk=instance.pk)
    except sender.DoesNotExist:
        pass  # Object is new, so field hasn't technically changed
    else:
        # check if state changed to Void 
        if pre_save_item_obj.state_id != VOID and instance.state_id == VOID:
            content = "item_name": instance.title, "item_description": instance.description

            EmailNotificationService().send_email("item_update"
                                                  ["myemail@gmail.com"], str(instance.container.id) +
                                                 str(instance.id) + " changed to Void",
                                                  content) 

【问题讨论】:

这行what if there will be some issue with saving and the item will not be saved 是什么意思如果您的预保存处理程序中没有引发异常,那么我认为不会出现问题 @ArpitSolanki 实际保存出错的可能性有很多!幸运的是,如果您的数据库中从未有过 IntegrityError,例如违反独特的约束等? IntegrityError 是您自己的错误。如果你采取良好的对策,那么它可以很容易地避免。 @schwobaseggl 【参考方案1】:

覆盖模型的save 方法没有任何问题。毕竟,在这里您可以获得所需的所有信息:

class X(models.Model):
    def save(self, *args, **kwargs):
        pre_obj = X.objects.filter(pk=self.pk).first()
        super(X, self).save(*args, **kwargs)
        # no exception from save
        if pre_obj and pre_obj.state_id != VOID and self.state_id == VOID:
            # send mail

【讨论】:

以上是关于Django - 保存前 VS 保存后 VS 查看保存的主要内容,如果未能解决你的问题,请参考以下文章

VS Code:保存时删除换行符

VS code保存文件后自动删除多余空格

保存后,文件从VS 2015解决方案中消失

VS如何设置类或函数前不显示引用的数量

vs2015如何设置类或函数前不显示引用的数量

VS2019 设置显示”高级保存选项“