我有一个功能,可以接收系统所有型号的信号。我希望通过 Django 命令进行数据库转储时,中断信号,因此在以此方式创建模型实例时不会调用该信号。
这是我的接收器功能:
@receiver(post_save)
def trigger_payment(sender, instance=None, created=False, **kwargs):
from TreasuryManagementApp.models import PaymentApplicationTrigger
if instance.__class__.__name__ not in trigger_models:
return
strategies = EventStrategies()
application_triggers = PaymentApplicationTrigger.objects.filter(event_name__in=trigger_models[instance.__class__.__name__]['event_names'])
for application_trigger in application_triggers:
strategies.execute(application_trigger, instance)
这是我的命令代码,我试图从信号上断开该功能:
class Command(BaseCommand):
help = _("""Run this command to import partners and operators from plane files""")
def execute(self, *args, **kwargs):
from TreasuryManagementApp.controllers import trigger_payment
Signal.disconnect(trigger_payment)
self.import_partners()
self.import_operators()
self.import_dead_ones()
问题在于对Signals.disconnect()
的此调用引发了以下异常:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/TaxistasVenv/lib/python3.7/site-packages/django/core/managemen
t/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/TaxistasVenv/lib/python3.7/site-packages/django/core/managemen
t/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/TaxistasVenv/lib/python3.7/site-packages/django/core/managemen
t/base.py", line 316, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/taxistas/GeneralApp/management/commands/startdatabase.py", lin
e 21, in execute
call_command('import_people')
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/TaxistasVenv/lib/python3.7/site-packages/django/core/managemen
t/__init__.py", line 148, in call_command
return command.execute(*args, **defaults)
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/taxistas/GeneralApp/management/commands/import_people.py", lin
e 433, in execute
Signal.disconnect(trigger_payment)
File "/Users/hugovillalobos/Documents/Code/TaxistasProject/TaxistasVenv/lib/python3.7/site-packages/django/dispatch/dispa
tcher.py", line 138, in disconnect
with self.lock:
AttributeError: 'function' object has no attribute 'lock'
答案 0 :(得分:1)
使用post_save
代替Signal
。 here中的文档说:“所有信号都是 django.dispatch.Signal 实例”,因此,您必须断开或连接实例,而不是Signal
类。>
from django.db.models.signals import post_save
class Command(BaseCommand):
help = _("""Run this command to import partners and operators from plane files""")
def execute(self, *args, **kwargs):
from TreasuryManagementApp.controllers import trigger_payment
post_save.disconnect(trigger_payment)
self.import_partners()
self.import_operators()
self.import_dead_ones()
post_save.connect(trigger_payment) # don't forget to reconnect