web-dev-qa-db-ja.com

Django:post_saveシグナルが新しいオブジェクトでトリガーされるかどうかを確認するにはどうすればよいですか?

Djangoで新しく作成されたオブジェクトに対してバックグラウンドで後処理を行う必要があります。この後処理は、更新されたばかりのオブジェクトではなく、新しいオブジェクトでのみ実行する必要があります。

Pre_saveで、オブジェクトにidがあるかどうかを確認できます。idがない場合は新しいオブジェクトです。しかし、問題は、後処理でidにアクセスする必要があることです(そのため、結果をデータベースに保存できます)。

これをきれいに行うにはどうすればよいですか?

47
Jon Tirsen

ドキュメントをご覧ください: https://docs.djangoproject.com/en/stable/ref/signals/#post-save

新しいオブジェクトの場合は、createdに設定される名前付き引数Trueがあります。

65
seler

Docs が述べられており、@ selerが指摘したように、例とともに:

def keep_track_save(sender, instance, created, **kwargs):
    action = 'save' if created else 'update'
    save_duplicate((instance.id, instance.__class__.__name__, action))

post_save.connect(keep_track_save, sender=Group)
15
elad silver

ここに置いておくだけで、誰かの役に立つかもしれません。

from Django.db import models
from Django.db.models.signals import post_save
from Django.dispatch import receiver


class Deal(models.Model):
    name = models.CharField(max_length=255)


@receiver(post_save, sender=Deal)
def print_only_after_deal_created(sender, instance, created, **kwargs):
    if created:
        print(f'New deal with pk: {instance.pk} was created.')
1
om2c0de