0

我正在尝试实现几个信号来创建、删除和删除在从数据库中创建或删除实例时生成的一些文件。

现在下面的代码正在工作:

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_delete 和 post_save 的方式有什么区别吗?

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

4

1 回答 1

2

也许您继承的模型也定义了 post_save 方法。

来自 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)
于 2013-04-12T19:08:01.557 回答