# Django's post_save doesn't always

[Django’s](https://docs.djangoproject.com/en/5.1/ref/signals/) `post_save` methods allow execution of custom code on an insert or update of a record after the `save` method is called.

The serialized object propagates through the signal handlers as the `instance` parameter which is eventually committed to the database only if *no exceptions* occur in any of the methods that listen to the signal.

Handlers:

* can be multiple which are synchronously chained
    
* will executed non-deterministically as per the [signal](https://docs.djangoproject.com/en/5.1/ref/signals/#signals)’s receiver registration
    
* will execute prior to a transaction commit
    
* will short-circuit execution on failure
    

Data inconsistencies are caused where proceeding methods in the `post_save` chain aren’t called after the one that throws an unhandled exception. The database record is not updated.

Additionally, the `instance` parameter has the most up-to date state which on an update, will revise the stale content that resides in the DB.

To avoid issues:

* Use transaction [on\_commit](https://docs.djangoproject.com/en/5.1/topics/db/transactions/#performing-actions-after-commit) to guarantee the data consistency
    
* Use the `instance` argument over re-reading it from the DB in handlers
    

References

* [Performing transaction on commit](https://docs.djangoproject.com/en/5.1/topics/db/transactions/#performing-actions-after-commit)
    
* [Django Signals](https://docs.djangoproject.com/en/5.1/ref/signals/#signals)
    
* [Django’s post\_save](https://docs.djangoproject.com/en/5.1/ref/signals/)
