【问题标题】:Django: passing variables from pre_save to post_save signalsDjango:将变量从 pre_save 传递到 post_save 信号
【发布时间】:2014-03-16 23:58:14
【问题描述】:

我使用 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 更强大,但那时我看不到模型实例中发生了什么变化。我想防止在我的模型的保存功能中使用全局变量或实现某些东西。

【问题讨论】:

    标签: django django-signals


    【解决方案1】:

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

    @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_completedsave 期间发生更改时,您才“发送分析”(这意味着save 不仅存储值,而且还进行了一些进一步的阐述)。

    如果您想在实例生命周期内(即从创建到save)更改字段时执行操作,您应该在post_init 期间存储初始值(而不是pre_save)。

    【讨论】:

    • 我已经在考虑这个了,但这对 Django 来说是个好习惯吗?为什么我要把它设为受保护的属性?感谢 post_init 提示,确实更好。
    • @jvannistelrooy:不需要受保护的属性,但最好不要在这些功能之外使用这些附加属性,因为它们只是服务字段。我在某处找到了这个解决方案......我会在找到它后立即发布链接
    • 您能否解释一下为什么post_initpre_save 更好?即使实际上不需要该值,它不会添加额外的数据库查询吗?
    • 我试过这个,但是当我尝试保存模型时,Activity 实例没有_activity_completed_old_value post_save
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2017-04-26
    • 2018-08-09
    • 2021-04-09
    • 2010-11-16
    • 2011-12-22
    • 2018-01-08
    • 2020-04-08
    相关资源
    最近更新 更多