сигнал pre_delete не работает в определенной директории - PullRequest
0 голосов
/ 29 сентября 2019

Я хочу удалить файл из хранилища, когда экземпляр File удален. Пытается использовать сигнал django.вот моя модель Файл:

class File(models.Model):
    orig_name = models.CharField(_('Original Name'), max_length=255)
    conversation = models.ForeignKey('conversation.Conversation', on_delete=models.CASCADE)

архитектура каждого приложения одинакова. Все приложения имеют собственный каталог signals, а в каталоге сигналов у нас есть файлы __init__.py и handlers.py.краткое дерево моего приложения с некоторыми подробностями для приложения file:


 apps
    ├── conversation
    ├── post    
    └── file
        ├── admin.py
        ├── apps.py
        ├── __init__.py
        ├── models.py
        ├── signals
        │   ├── handlers.py
        │   └── __init__.py
        ├── tests.py
        ├── urls.py
        └── views.py

здесь apps/file/apps.py:

from django.apps import AppConfig


class FileConfig(AppConfig):
    name = 'apps.file' # exact as INSTALLED_APP in setting.py

    def ready(self):
        import apps.file.signals.handers

здесь apps/file/signals/handlers.py:

Файл
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from apps.file.models import File


@receiver(pre_delete, sender=File)
def remove_file_from_storage(sender, instance, *args, **kwargs):
      print('pre_delete signal for File working')
      # some code is here

и app/file/signals/__init__.py пуст.В этом проекте мы используем несколько сигналов, и все они работают нормально, но я не знаю, почему этот сигнал не работает. Другой сигнал - от пользовательского и встроенного сигнала.пожалуйста, обратите внимание, когда я перемещаю функцию def remove_file_from_storage в другое приложение в app_name/signals/handlers.py, она работает нормально. Процесс удаления - это простой generics.DestroyAPIView DRF.где проблема с моим архитектором использования сигнала? спасибо

1 Ответ

2 голосов
/ 29 сентября 2019

Проблема в том, что вы используете receiver декоратор для регистрации сигналов.При этом вы должны поместить свой код в готовую функцию вашего приложения Django. Этот документ упоминает об этом:

На практике обработчики сигналов обычно определяются в подмодуле сигналов приложения, к которому они относятся.Приемники сигналов подключаются в метод ready () класса конфигурации вашего приложения.Если вы используете декоратор receive (), просто импортируйте подмодуль сигналов внутри ready ().

Но на практике мы не будем помещать код всех сигналов в метод ready, которыйможет сделать наш код сложнее для чтения и поддержки.Как и вы, мы поместим сигналы внутри signals.py, а затем загрузим их в ваше приложение с помощью метода ready, например:

from django.apps import AppConfig


class FileConfig(AppConfig):
    label = 'file'
    name = 'file'

    def ready(self):
        from apps.file import signals  # NOQA
        # add # NOQA to ignore error message from Python linter when we just import but never used

и установим его на __init__.py, чтобы Django могОткройте ваше приложение:

 apps
    ├── conversation
    ├── post    
    └── file
        ├── admin.py
        ├── apps.py
        ├── __init__.py # Add to this file
        ├── models.py
        ├── signals
        │   ├── handlers.py
        │   └── __init__.py
        ├── tests.py
        ├── urls.py
        └── views.py
default_app_config = 'apps.file.apps.FileConfig'

Вы также можете взглянуть на эту статью , чтобы узнать больше о сигналах Джанго

Надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...