I think the simplest way is to use transaction.on_commit(). Here’s an example using the models.Model subclass Photo
that will only talk to Elasticsearch once the current transaction is over:
from django.db import transaction
from django.db.models.signals import post_save
@receiver(post_save, sender=Photo)
def save_photo(**kwargs):
transaction.on_commit(lambda: talk_to_elasticsearch(kwargs['instance']))
Note that if the transaction.on_commit()
gets executed while not in an active transaction, it will run right away.