Django:将变量从pre_save传递到post_save信号

时间:2014-02-17 15:43:50

标签: django django-signals

我使用pre_save和post_save信号将分析发送到Mixpanel。我更喜欢将它与模型的保存方法分开。

有没有办法在pre_save信号出现时保存实例的旧值,然后在post_save上检查新值?

我的代码如下所示:

@receiver(pre_save, sender=Activity)
def send_user_profile_analytics(sender, **kwargs):
    activity_completed_old_value = kwargs['instance'].is_completed
    # store this value somewhere?

@receiver(post_save, sender=Activity)
def send_user_profile_analytics(sender, **kwargs):
    if kwargs['instance'].is_completed != activity_completed_old_value:
        # send analytics

对我而言,使用post_save发送分析而不是pre_save似乎更健壮,但在那时我无法看到模型实例中发生了什么变化。我想阻止使用全局变量或在模型的保存函数中实现某些东西。

1 个答案:

答案 0 :(得分:6)

您可以将它们存储为实例属性。

@receiver(pre_save, sender=Activity)
def send_user_profile_analytics(sender, **kwargs):
    instance = kwargs['instance']
    instance._activity_completed_old_value = instance.is_completed

@receiver(post_save, sender=Activity)
def send_user_profile_analytics(sender, **kwargs):
    instance = kwargs['instance']     
    if instance.is_completed != instance._activity_completed_old_value:
        # send analytics

通过这种方式,只有在is_completed期间save发生更改时才会“发送分析”(这意味着save不仅会存储值,而是会进一步详细说明)。

如果要在实例生命期间(即从创建到save)更改字段时执行操作,则应在post_init期间存储初始值(而不是{ {1}})。