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 シグナルが機能しています。(save メソッドを上書きする代わりに) 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 の設定方法に違いはありますか?

多重継承がこれに奇妙な影響を与えている可能性はありますか?

4

1 に答える 1

2

継承しているモデルにも post_save メソッドが定義されている可能性があります。

Django のドキュメントから:

状況によっては、信号を接続しているモジュールが複数回インポートされることがあります。これにより、レシーバー関数が複数回登録され、1 つのシグナル イベントに対して複数回呼び出される可能性があります。

解決策は、次のようにシグナルに一意の識別子を設定することです。

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 に答える