web-dev-qa-db-fra.com

Django: comment savoir si le signal post_save se déclenche sur un nouvel objet?

Je dois effectuer un post-traitement en arrière-plan sur des objets nouvellement créés dans Django. Ce post-traitement ne doit être exécuté que sur de nouveaux objets, pas sur des objets qui viennent d'être mis à jour.

Je sais que dans pre_save je peux vérifier si l'objet a un identifiant, si ce n'est pas le cas, alors c'est un nouvel objet. Mais le problème est que, dans le post-traitement, j'ai besoin d'un accès à l'id (pour pouvoir sauvegarder les résultats dans la base de données).

Comment puis-je faire cela d'une manière propre?

41
Jon Tirsen

Consultez la documentation: https://docs.djangoproject.com/fr/stable/ref/signals/#post-save

Il existe un argument nommé created qui sera défini sur True s'il s'agit d'un nouvel objet.

56
seler

Comme Docs statement et @seler ont souligné, mais avec un exemple:

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)
12
elad silver

Je laisse juste ça ici, peut-être que ça va être utile à quelqu'un.

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