2011-08-09 15 views
14

私はzipファイルをアップロードしてpost_save信号を使ってそれを抽出できるシステムを作成しようとしています。djangoシグナル、 "インスタンス"の使い方

class Project: 
    .... 
    file_zip=FileField(upload_to='projects/%Y/%m/%d') 

@receiver(post_save, sender=Project) 
def unzip_and_process(sender, **kwargs): 
    #project_zip = FieldFile.open(file_zip, mode='rb') 
    file_path = sender.instance.file_zip.path 
    with zipfile.ZipFile(file_path, 'r') as project_zip: 
     project_zip.extractall(re.search('[^\s]+(?=\.zip)', file_path).group(0)) 
     project_zip.close() 

unzip_and_process方法正しいファイルパスが提供されたときに正常に動作します(この場合、私はinstance.file_zip.pathを提供する必要があります。しかし、私が取得/シグナルでインスタンスを設定することができませんでした。信号に関するDjangoのドキュメントは明確ではありません。?。と何の例を持っていないので、私は

答えて

19

を何をしますか実は、Django's documentation about signalsは非常に明確であると例が含まれてい

あなたのケースでは、post_save信号は、次の引数を送信します。sender(モデルクラス)、 instance(instクラスsenderのance)、created,rawおよびusingである。あなたがinstanceにアクセスする必要がある場合、あなたはあなたの例ではkwargs['instance']を使用してアクセスするか、または、より良い、引数を受け入れるようにコールバック関数を変更することができます。

@receiver(post_save, sender=Project) 
def unzip_and_process(sender, instance, created, raw, using, **kwargs): 
    # Now *instance* is the instance you want 
    # ... 
+0

私がまだ知らない '** kwargs 'についてだと思います。あなたの例はうまくいく、ありがとう。 –

+0

@Ferdinand djangoのドキュメントのpost_saveの例はありません。 – Anuj

+0

@Anuj - 'post_save'についての例はありませんでした。シグナルの一般的な使い方の例がありますが、これは 'post_save'にも当てはまります。なぜなら、この特定のシグナルに特別なものはないからです。 –

1

Django Signalsを接続する際にこれが私の仕事:

ここにありますそれにアクセス

class MyModel(models.Model): 
    name = models.CharField(max_length=100) 

そして信号models.py post_save

@receiver(post_save, sender=MyModel) 
def print_name(sender, instance, **kwargs): 
    print '%s' % instance.name 
関連する問題