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