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:(你在你的文件
应用程序中添加相同的内容。我会的