7

フィールドの前の値にアクセスする必要がある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ただし、 inを取得することが不可欠ですpost_signal。これに基づいて、サードパーティの API 呼び出しを行うかどうかを決定する必要があるためです。pre_saveAPIは同じデータベースを使用しており、更新された値がコミットされることを期待しているため、API呼び出しを行うことができません。

考えられる 1 つの方法は、post_save でアクセスできるインスタンス自体に old_value を追加することです。

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"

これを達成するためのより良い方法はありますか。

4

1 に答える 1

8

残念ながら、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
于 2012-08-07T10:49:24.120 に答える