A small utility package for temporarily disabling django signals
pip install django-signal-disabler
There are multiple ways to use this package:
-
As a function:
disabler = signal_disabler.disable() obj = Model() disabler.disconnect_all() obj.save() # will not call any signals disabler.reconnect_all()
-
As a context manager
obj = Model() with signal_disabler.disable(): obj.save() # will not call any signals
-
As a decorator
@signal_disabler.disable() # note the parenthesis def save(obj) obj.save() save(Model()) # will not call any signals
Not all signals are disabled. The default includes:
pre_init,post_initpre_save,post_savepre_delete,post_deletepre_migrate,post_migrate
To disable other signals, one has to provide their list when instantiating disabler. Let's say we
have a signal called email_sent. To disable it use:
email = Email()
with signal_disabler.disable(email_sent):
email.send()