Django Signal.disconnect вызывает объект «функция» не имеет атрибута «ошибка блокировки» - PullRequest
0 голосов
/ 28 июня 2019

У меня есть функция, которая является приемником сигналов от всех моделей системы. Я хочу, чтобы сигналы прерывались, когда я выполняю заполнение дампа базы данных с помощью команды 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 Ответ

1 голос
/ 28 июня 2019

Используйте post_save вместо Signal. Документация в здесь гласит: «Все сигналы 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
...