Search code examples
djangotransactionssignalscommit

run code after transaction commit in Django


Is there any way to run some code after transaction commit in Django?

I need to send some messages to a rabbitmq server for offline processing, but the message gets to the consumer before the Django transaction is commited.

My message is sent in the post_save signal of the model. What I'm looking for is a similar mechanism, using signals or something else, that would execute code after the commit (and do nothing if the transaction fails).

I haven't found any generic way of doing it in Django. Do you have any ideas?


Solution

  • django-transaction-hooks solves this problem for Django < 1.9, and the functionality is built into Django 1.9+:

    from django.db import transaction
    
    def do_something():
        pass  # send a mail, invalidate a cache, fire off a Celery task, etc.
    
    transaction.on_commit(do_something)