58

我需要对 Django 中新创建的对象进行一些后台后处理。这种后处理应该只在新对象上运行,而不是刚刚更新的对象。

我知道在 pre_save 中我可以检查对象是否有 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

正如文档所述和@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 回答