2013-04-12 6 views
7

私は2 ManyToManyフィールドのDjangoモデルを持っています。モデルが保存されるたびにモデルからデータを処理したいと思います。モデル全体を保存した後のDjangoシグナル

ManyToManyの関係を保存する前に、post_save信号が送信されるため、その信号は使用できません。その後、あなたはm2m_changedシグナルを持っていますが、私は2 ManyToManyフィールドを持っているので、私は信号を入れるべきManyToManyフィールドを確信できません。

ManyToManyフィールドがすべて保存された後にトリガーされる信号はありませんか?

+0

Googleで見つけてみてください:http://techblog.ironfroggy.com/2011/02/django-how-to-hook-in-after-multiple.html - いくつかの参考にします –

+0

ありがとうございます投稿したリンク上のソリューションは、Django管理者のみを使用する場合にのみ機能します。私はモデルがDjangoの管理者の外に保存されたときにサポートが必要です。 – rednaw

+0

http://stackoverflow.com/questions/1221878/why-does-django-post-save-signal-give-me-pre-save-data – catherine

答えて

3

m2m_changeの後にデータを処理することが唯一の選択肢だと思うが、「このモデルのすべての関連データが保存を完了しました」というイベントまたは信号が表示されないためです。

これはコストが高い場合は、処理を非同期で処理できます。私は同様の状況に遭遇したとき、処理に関連する状態(たとえば、MyModel.needs_processing)と別の非同期タスクキュー(私の場合はCelery)が1分ごとに掃引して処理を処理するように、ブール型フィールドをモデルに追加しました/状態をリセットする。あなたのケースでは

m2m_changedneeds_processingFalseであれば、あなたはTrueneeds_processingを設定し、モデルを保存し、自分のタスクキューの処理のためにそれをマークすることができます。その後、他のm2mフィールドに2番目のm2m_changedが起動されても、重複した処理コストは発生しません。

関連する問題