Django - 预保存VS后保存VS视图保存

时间:2017-09-04 07:41:04

标签: python django signals

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

@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) 

1 个答案:

答案 0 :(得分:0)

覆盖模型的Element.ElementID方法没有任何问题。毕竟,这是您拥有所需信息的地方:

save