Django post_delete和post_save信号的使用有什么区别吗?

Django post_delete和post_save信号的使用有什么区别吗?,django,Django,我试图实现几个信号,用于创建、删除和删除在创建实例或从数据库中删除实例时生成的一些文件 现在,以下代码正在运行: class Document(TimeStampedModel, StatusModel): ... def save(self, *args, **kwargs): create = self.pk is None super(Document, self).save(*args, **kwargs) if cre

我试图实现几个信号,用于创建、删除和删除在创建实例或从数据库中删除实例时生成的一些文件

现在,以下代码正在运行:

class Document(TimeStampedModel, StatusModel):

    ...

    def save(self, *args, **kwargs):
        create = self.pk is None
        super(Document, self).save(*args, **kwargs)
        if create:
            os.makedirs(self.get_root_path())
            self.process_file()

from django.db.models.signals import post_delete, post_save
from django.dispatch.dispatcher import receiver

@receiver(post_delete, sender=Document)
def document_delete(sender, instance, **kwargs):
    shutil.rmtree(instance.get_root_path(), ignore_errors=True)
    instance.docfile.delete(False)
post_delete信号正在工作。当我尝试设置post_save信号(而不是过度写入save方法)时,它不起作用。信号永远不会被调用

class Document(TimeStampedModel, StatusModel):

    ...


from django.db.models.signals import post_delete, post_save
from django.dispatch.dispatcher import receiver

@receiver(post_delete, sender=Document)
def document_delete(sender, instance, **kwargs):
    shutil.rmtree(instance.get_root_path(), ignore_errors=True)
    instance.docfile.delete(False)

@receiver(post_save, sender=Document)
def document_save(sender, instance, created, **kwargs):
    print "this is never called"
    if created:
        os.makedirs(instance.get_root_path())
        instance.process_file()
配置post_删除和post_保存的方式有什么不同吗


多重继承是否可能以一种奇怪的方式影响这一点?

可能您继承的模型也定义了一种保存后方法

来自Django文档:

在某些情况下,连接信号的模块可能会多次导入。这可能会导致接收器函数被多次注册,因此对单个信号事件调用多次

解决方案是为信号设置一个唯一标识符,如下所示:

from django.db.models.signals import post_delete, post_save
import uuid

"""Class Document"""

def document_save(sender,instance,*args, **kwargs):
    if created:
        os.makedirs(instance.get_root_path())
        instance.process_file()

post_save.connect(document_save, dispatch_uid=str(uuid.uuid1()),sender = Document)

谢谢它可以工作,但我仍然有一个问题。在任何相关的保存中都会调用它。当我尝试在connect中使用sender参数时,它不起作用
post\u save.connect(gen\u key,sender=Document
,dispatch\u uid=“my\u unique\u identifier”)`。