获取post_save信号中字段的先前值

时间:2012-08-07 10:14:40

标签: python django signals

我在django中有一个发布信号,我需要访问字段的先前值:

post_save.connect(callback_function_postsave, sender=Media)

我理所当然地知道我应该使用pre_save:

pre_save.connect(callback_function_presave, sender=Media)

def callback_function_presave(sender, instance,*args,**kwargs):
try:
    old_value = sender.objects.get(pk=instance.pk).field
except sender.DoesNotExist:
    return

但是,必须在old_value中获取post_signal,因为基于此,我必须决定是否进行第三方API呼叫。我无法在pre_save中进行api调用,因为api正在使用相同的数据库,并期望提交更新的值。

我能想到的一种可能方法是将old_value添加到实例本身,然后可以通过post_save访问:

def callback_function_presave(sender, instance,*args,**kwargs):
try:
    instance.old_value = sender.objects.get(pk=instance.pk).field
except sender.DoesNotExist:
    return

def callback_function_postsave(sender, instance,*args,**kwargs):
try:
    old_value = instance.old_value
except:
    print "This is a new entry"

有没有更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:6)

不幸的是,post_save信号没有给出旧值(post_save)。因此,将旧值存储在模型上似乎是一个很好的解决方案。

我会像这样编写pre_save:

def save_old_value(sender, instance, *args, **kwargs):
    if instance.id:
        instance.old_value = instance.__class__.objects.get(id=instance.id).old_value