2012-08-07 3 views
3

У меня есть пост сигнал в Джанго, где мне нужно, чтобы получить доступ предыдущего значения поля:Получить предыдущее значение поля в post_save сигнала

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 

Однако его необходимо получить в post_signalold_value, потому что на его основе, я должен решить, следует ли сделать 3-й вызов сторона апи или нет. Я не могу сделать api-вызов в pre_save, поскольку 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" 

Есть ли лучший способ для достижения этой цели.

+0

как вы разрешили его? – navyad

ответ

5

К сожалению, сигнал 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 
Смежные вопросы