Django pre_delete信号在特定目录下不工作

Django pre_delete信号在特定目录下不工作,django,postgresql,django-rest-framework,signals,Django,Postgresql,Django Rest Framework,Signals,我想在删除文件实例时从存储器中删除文件。正在尝试使用django信号。这是我的模型文件: class File(models.Model): orig_name = models.CharField(_('Original Name'), max_length=255) conversation = models.ForeignKey('conversation.Conversation', on_delete=models.CASCADE) 每个应用程序的架构都是相同的。这

我想在删除
文件
实例时从存储器中删除文件。正在尝试使用django信号。这是我的模型文件:

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

每个应用程序的架构都是相同的。这意味着所有应用程序都有自己的
signals
目录,在signals的目录中,我们有
\uuuu init\uuuuuuuuuuuupy
handlers.py
文件。下面是我的应用程序的简要目录树,其中包含
文件
的一些详细信息:


 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_从_存储
函数移动到其他应用程序的相关
app_name/signals/handlers.py中时,它工作正常。删除过程是一个简单的
泛型。DRF的DestroyAPIView
。我的架构师在使用信号时遇到了什么问题?谢谢你

问题是因为你使用了
接收器
装饰器来注册信号。因此,您必须将代码放在Django应用程序的ready函数中。他提到:

实际上,信号处理程序通常定义在与之相关的应用程序的信号子模块中。信号接收器在应用程序配置类的ready()方法中连接。如果您使用的是receiver()decorator,只需将signals子模块导入ready()中即可

但在实际操作中,我们不会将所有信号代码放在
ready
方法中,这可能会使代码更难阅读和维护。就像您所做的那样,我们将把信号放入
signals.py
中,然后通过
ready
方法将其加载到您的应用程序中,如下所示:

从django.apps导入AppConfig
类FileConfig(AppConfig):
label='file'
名称='文件'
def就绪(自我):
从apps.file导入信号#NOQA
#添加#NOQA以在我们只导入但从未使用时忽略来自Python linter的错误消息
并将其设置为
\uuuu init\uuuu.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\u app\u config='apps.file.apps.FileConfig'
您还可以查看以获得有关Django信号的更多详细信息


希望有帮助

问题是因为您使用
接收器
装饰器来注册信号。因此,您必须将代码放在Django应用程序的ready函数中。他提到:

实际上,信号处理程序通常定义在与之相关的应用程序的信号子模块中。信号接收器在应用程序配置类的ready()方法中连接。如果您使用的是receiver()decorator,只需将signals子模块导入ready()中即可

但在实际操作中,我们不会将所有信号代码放在
ready
方法中,这可能会使代码更难阅读和维护。就像您所做的那样,我们将把信号放入
signals.py
中,然后通过
ready
方法将其加载到您的应用程序中,如下所示:

从django.apps导入AppConfig
类FileConfig(AppConfig):
label='file'
名称='文件'
def就绪(自我):
从apps.file导入信号#NOQA
#添加#NOQA以在我们只导入但从未使用时忽略来自Python linter的错误消息
并将其设置为
\uuuu init\uuuu.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\u app\u config='apps.file.apps.FileConfig'
您还可以查看以获得有关Django信号的更多详细信息


希望有帮助

你好@mehdi,你能同时提供你的
apps.py
文件吗?@Toankocho谢谢你的回复。问题更新为
apps/file/apps.py
.Hi@mehdi,你能同时提供你的
apps.py
文件吗?@Toankocho谢谢你的回复。问题已更新为
apps/file/apps.py
。感谢您的帮助。我这样做了,但我的信号仍然没有调用
apps/file/signals/handlers.puy
,因为我把代码放在了我的问题中,我不知道为什么?(我正在根据你的提示更新我的问题,所以如果你有任何想法,请告诉我)你检查过ready方法被调用了吗?你可以看看我在答案中嵌入的文章,在文件模块的
\uuu init\uuuuuuuuupy
中,你可以添加这一行以确保你的应用程序正确加载:
default\u app\u config='apps.file.apps.FileConfig'
default\u app\u config='apps.klass.apps.ClassConfig'
存在于
klass
app中。确切地说,当我将我的信号功能放入此应用程序(放入信号目录)时,它正在工作,但在这个
klass
应用程序中它不工作。我现在需要做什么?将我的所有信号添加到此应用程序?!sry if i'm To noob:(你在你的
文件
应用程序中添加相同的代码。我会更新我的答案谢谢你的帮助。我这样做了,但我的信号仍然没有调用
应用程序/文件/信号/处理程序。用我在问题中输入的代码,我不知道为什么?(我正在根据你的提示更新我的问题,如果你有任何想法,请告诉我)你检查过ready方法是否被调用了吗?你可以看看我在答案中嵌入的文章,在文件模块的
\uuuu init\uuuuuuuuupy
中,你可以添加这一行以确保你的应用程序加载正确:
默认应用程序配置='apps.file.apps.FileConfig'
默认应用程序配置='apps.klass.apps.Class'配置“
存在于
klass
应用程序中。当我将我的信号功能放入此应用程序(进入信号目录)时,它正在工作,但在
klass
应用程序中它不工作。我现在需要做什么?将我的所有信号添加到此应用程序中?!如果我太多noob:(你在你的
文件
应用程序中添加相同的内容。我会的