2013-04-12 24 views
0

我想實現一些信號來創建和刪除和刪除某些文件,這些文件是在創建或從數據庫中刪除實例時生成的。信號post_delete和post_save的使用有什麼不同嗎?

現在下面的代碼工作:

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信號(而不是寫保存方法)時,它不起作用。信號從未被調用。

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的方式有什麼不同嗎?

多重繼承是否可能以一種奇怪的方式影響這個?

回答

2

也許你正在繼承的模型有一個post_save方法定義爲wellwell。

從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) 
+0

感謝。它的工作原理,但我仍然有問題。它在任何相關的保存中被調用。當我嘗試在connect中使用sender參數時,它不起作用'post_save.connect(gen_key,sender = Document',dispatch_uid =「my_unique_identifier」)'。 –

相關問題