Django:如何判断post_save信号是否在新对象上触发?

62

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

我知道在pre_save中可以检查对象是否具有id,如果它没有id则是一个新对象。但问题在于,在后处理中我需要访问id(以便我可以将结果保存回数据库)。

有什么干净的方法可以实现这个需求吗?


2
有没有可能在实际保存后进行处理?然后使用post_save,https://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save。它有一个布尔值来表示它是新的还是只是更新。 - andersem
3个回答

97

30

正如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)

11

我就把它留在这里,也许对某些人会有所帮助。

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.')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接