Yuji 'Tomita' Tomita Yuji 'Tomita' Tomita - 3 months ago 52
Python Question

Django post_save preventing recursion without overriding model save()

There are many Stack Overflow posts about recursion using the

post_save
signal, to which the comments and answers are overwhelmingly: "why not override save()" or a save that is only fired upon
created == True
.

Well I believe there's a good case for not using
save()
- for example, I am adding a temporary application that handles order fulfillment data completely separate from our Order model.

The rest of the framework is blissfully unaware of the fulfillment application and using post_save hooks isolates all fulfillment related code from our Order model.

If we drop the fulfillment service, nothing about our core code has to change. We delete the fulfillment app, and that's it.

So, are there any decent methods to ensure the post_save signal doesn't fire the same handler twice?

Answer

How about disconnecting then reconnecting the signal within your post_save function:

def my_post_save_handler(sender, instance, **kwargs):
    post_save.disconnect(my_post_save_handler, sender=sender)
    instance.do_stuff()
    instance.save()
    post_save.connect(my_post_save_handler, sender=sender)
post_save.connect(my_post_save_handler, sender=Order)