2016-05-30 8 views
0

私は、同様の質問(Django accessing ManyToMany fields from post_save signal)を表示しようとしましたが、更新された関連オブジェクトリストを取得する方法はまだ分かりません。Django:信号内のm2m関連オブジェクトを取得する

など。私は以下のモデルを持っています

class User(models.Model): 
    username = models.CharField 

class Blog(models.Model): 
    user = models.ManyToManyField('User') 

私はdjango adminを使って、特定のブログにユーザーを追加しています。

だから私は、以下の信号は、(私は追加した)すべての新規ユーザーを印刷することを期待...しかし...私は古いリストのすべての時間を取得しています:(

@receiver(m2m_changed, sender=Blog.users.through) 
def blog_users_change(sender, instance, **kwargs): 
    print instance.users.all() 

最後の行は、ユーザーinstance.users.all()の古いリストを与える。例えば、ユーザーはここで追加が反映されません。

+1

これは元のコードですか?あなたのm2mが 'Blog.users'ではなく' Blog.users'です。 – noteness

答えて

1

m2m_changed信号を保存/更新プロセス中にいくつかの段階で焼成し、あなたは何を告げるシグナルハンドラに供給されるaction引数がありますされていますそれが入っているステージ。documentationから:

作用

関係で行われる更新のタイプを示す文字列。これは、次のいずれかになります。

1つまたは複数のオブジェクトの前に送信され を関係に追加された「pre_add」。

"post_add" 1つ以上のオブジェクトがリレーションに追加された後に送信されます。

"pre_remove" 1つ以上のオブジェクトがリレーションから削除される前に送信されます。

"post_remove" 1つ以上のオブジェクトがリレーションから削除された後に送信されます。

"pre_clear" リレーションがクリアされる前に送信されます。

「post_clear」 関係をクリアした後に送信されます。あなたがpre_removeアクションをキャッチした場合

そして、あなたは、いくつかの関係から削除されてい前に、すべてのオブジェクトを取得します。そのため、明らかに変更されていないユーザーの一覧が表示されます。

あなたのコードは何をするかを決める前にactionをチェックする必要があります。例:

@receiver(m2m_changed, sender=Blog.users.through) 
def blog_users_change(sender, instance, action, **kwargs): 
    if action == 'pre_remove': 
     # This will give you the users BEFORE any removals have happened 
     print instance.users.all() 
    elif action == 'post_remove': 
     # This will give you the users AFTER any removals have happened 
     print instance.users.all() 
+0

私はまだpost_addが更新されたリストを見ることを許可していないと思っています。私は追加しています) –

関連する問題