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_init
pre_save
,post_save
pre_delete
,post_delete
pre_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()