58

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

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

どうすればこれをクリーンな方法で行うことができますか?

4

3 に答える 3

88

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

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

于 2012-05-20T10:58:40.770 に答える
26

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)
于 2015-06-02T14:17:57.993 に答える
9

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

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.')
于 2019-02-18T15:10:59.803 に答える