2017-11-30 12 views
8

TLをDjangoの信号を送信する方法; DR:
私はpost_save信号の後にカスタム信号をトリガする方法が必要で、自動的に、それを行うための方法はありますか?他の信号から


私は現在、ジャンゴにpost_save信号が付属して行くの多くを必要とジャンゴのためのライブラリを開発していると私はそれが後post_saveを別の信号をトリガすることが可能ですので、もし私が実装できると思いましてライブラリを使用するプロジェクトで行う必要がある場合は、post_saveに介入しないでください。

これまでのところ、信号は送信側の引数としてクラスを受け取ることが予想され、post_saveから信号を手動でトリガーすると何もしませんでした(まだ介入しています)。このための回避策はありますか?私はドキュメントで何かを見逃していますか?

post_save.send(MyModel, instance=a_mymodel_instance) 

はそのような何かをする簡単な方法があります:これは、このような別の信号の中から、手動で信号を呼び出すことで可能であるかもしれないが

+0

*なぜ*カスタム信号が必要ですか?あなたがする必要があるものが保存されるたびに発生したら、 'post_save'シグナルを使用してください。シグナルハンドラに渡されるすべての引数を使用するかどうかは関係ありません。 – solarissmoke

+0

こんにちは、@OscarCarballal私は疑問に思っていました。 –

+0

はい、申し訳ありませんが、私はそれをマーキングすることを完全に忘れました。ありがとう:) –

答えて

6

は、私たちは、あなたが従っていると仮定しましょう私はこの答えに使用するファイル編成:Django Create and Save Many instances of model when another object are created


提案1:

  • 私たちはあなたの最初のpost_saveMyModel1に何かをすると、別のpost_save信号が第1の信号をトリガインスタンス上でいくつかの処理の後MyModel2に何かをすると仮定しよう。
  • post_saveはいつもエンドsave()の方法で送信されます。次のよう
  • はあなたの信号を整理:

    @receiver(post_save, sender=MyModel1) 
    def mymodel1_signal (sender, instance, **kwargs): 
        Do stuff on MyModel1 instance... 
        Do also stuff on MyModel2 and then call MyModel2.save() 
    
    
    @receiver(post_save, sender=MyModel2) 
    def mymodel2_signal (sender, instance, **kwargs): 
        Do stuff on MyModel2 instance... 
    

    mymodel2_signal信号がmymodel1_signalからMyModel2.save()への呼び出し後にトリガーれますこの方法です。


提言2:

  • 正しい "タイミング" を達成するための信号のミックスを使用してください。
  • MyModel1取得者はpre_savepost_save信号を使用し
  • を保存する前に、私たちはあなたがMyModel2でプロセスを開始したいと仮定しましょう:

    @receiver(pre_save, sender=MyModel1) 
    def mymodel1_signal (sender, instance, **kwargs): 
        Do stuff on MyModel1 instance... 
        Do also stuff on MyModel2 and then call MyModel2.save() 
    
    
    @receiver(post_save, sender=MyModel2) 
    def mymodel2_signal (sender, instance, **kwargs): 
        Do stuff on MyModel2 instance... 
    

提言3:

MyModel2方法を直接MyModel1post_saveシグナルの中に挿入します。

+0

多くのインスタンスを操作する場合、我々はそれを行うためにオフラインタスクをtrigerにdjangoチャネルを使用することがあります。 – Hayden

+0

@Hayden私は現在、ジャンゴチャンネルでの経験はありません。だから、あなたが言うことは面白いようです:) –

関連する問題