我使用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似乎更健壮,但在那时我无法看到模型实例中发生了什么变化。我想阻止使用全局变量或在模型的保存函数中实现某些东西。
答案 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}})。