gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:52:54 25 4
gpt4 key购买 nike

我使用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更为健壮,但是那时我看不到模型实例中发生了什么变化。我想避免在模型的保存功能中使用全局变量或实现某些操作。

最佳答案

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

@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(而不是 pre_save)期间存储初始值。

关于Django:将变量从pre_save传递到post_save信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com