According to the docs, if you use autocommit , the changes in the original instance will be committed to .save() before any post_save signal post_save . An exception in post_save does not post_save changes to the original instance.
You can confirm this by looking at the source on save_base in django/db/models/base.py Auto-reporting will occur on line 555 (in 1.4.2), but the post_save signal post_save not sent until line 564 . You can also see that Django is not trying to use nested transactions in .save() .
If you use django.middleware.transaction.TransactionMiddleware and did not override its behavior using the autocommit decorator, an exception during post_save throw the whole transaction, including changes to the original instance.
source share