Django Signal.disconnect引发“函数”对象没有属性“锁定”错误

时间:2019-06-28 00:01:16

标签: python django django-signals

我有一个功能,可以接收系统所有型号的信号。我希望通过 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'

1 个答案:

答案 0 :(得分:1)

使用post_save代替Signalhere中的文档说:“所有信号都是 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