(Django 1.1)私は、m2mフィールドを使ってメンバを追跡するProjectモデルを持っています。それは次のようになります。Django - post_saveシグナル経由でm2mデータを保存するには?
class Project(models.Model):
members = models.ManyToManyField(User)
sales_rep = models.ForeignKey(User)
sales_mgr = models.ForeignKey(User)
project_mgr = models.ForeignKey(User)
... (more FK user fields) ...
プロジェクトが作成され、選択したsales_rep
、sales_mgr
、project_mgr
などUser
Sはそれが簡単にプロジェクトの権限を追跡するために作るためにメンバーに追加されます。これまでのところ、このアプローチは非常にうまくいっています。
私が今対処している問題は、User
FKフィールドの1つが管理者によって更新されたときにプロジェクトのメンバーシップを更新する方法です。私はこの問題への様々な解決策を試してみたが、クリーンなアプローチは、以下のようなpost_save
信号であるように見えた:私は介して、フィールドの1つを変更しても
def update_members(instance, created, **kwargs):
"""
Signal to update project members
"""
if not created: #Created projects are handled differently
instance.members.clear()
members_list = []
if instance.sales_rep:
members_list.append(instance.sales_rep)
if instance.sales_mgr:
members_list.append(instance.sales_mgr)
if instance.project_mgr:
members_list.append(instance.project_mgr)
for m in members_list:
instance.members.add(m)
signals.post_save.connect(update_members, sender=Project)
しかし、Project
はまだ同じメンバーを持っています管理者!私は他のプロジェクトで自分のビューを使ってメンバーのm2mフィールドを更新して成功しましたが、管理者とのやりとりがうまくいくようにする必要はありませんでした。
メンバーシップを更新するためにpost_save信号以外の方法がありますか?あなたの助けを前もってありがとう!
UPDATE:
だけ明確にする私は(古いメンバーが削除され、新しいものが追加されている)フロントエンドで自分のフォームを保存するとき、post_save信号が正常に動作します。しかし、adminを介してプロジェクトを保存すると、post_save信号が正しく機能しません(メンバーは同じままです)。
私はPeter Rowellの診断がこの状況で正しいと思います。 adminフォームから「members」フィールドを削除すると、post_save信号が正しく機能します。フィールドがインクルードされると、保存時にフォームに存在する値に基づいて古いメンバーが保存されます。プロジェクトが保存されるとき(信号またはカスタム保存メソッドであろうと)メンバーm2mフィールドにどのような変更を加えても、保存前にフォームに存在していたメンバーによって常に上書きされます。それを指摘してくれてありがとう!
これはあなたの問題であれば、私は知らないが、私はあなたがどのようにフォームのコードのアーティファクトの中に実行されて勘を持っている:サヴェリオの答えに続き
は、次のコードは、私の問題を解決しましたm2m infoを更新します。基本的には最初にメインオブジェクトを保存してからm2mの値をすべてクリアし、*の形式で*存在する値に基づいて設定します。これはメインオブジェクトのsave()の後で*発生するので、save()や 'post_save'シグナルに基づいて何かをやってから、*元に戻します*。これは 'django.forms.models.save_instance()'にあります。 'after_form_save'シグナルがあればいいでしょう。 –
ありがとう、ピーター!私はあなたの診断が正しいと信じています。この情報を含めるためにオリジナルの投稿を更新しました。 –
ピーターは正しいです。私は同じ問題を抱えていましたが、回避策を見つけましたが、 'after_form_save'シグナルとしてきれいではありません:http://stackoverflow.com/questions/3652585/simple-django-form-model-save-question –