2016-05-30 12 views
0

Ich war irgendwie versucht, ähnliche Fragen zu sehen (Django accessing ManyToMany fields from post_save signal), aber immer noch nicht sehen, wie die aktualisierte verwandte Objekte Liste zu bekommen.Django: Getting m2m bezogenen Objekte in Signale

z. Ich habe folgende Modelle

Jetzt bin ich einen Benutzer zu einem bestimmten Blog hinzufügen, über django admin.

So erwarte ich, dass das Signal unter, werden alle neuen Benutzer drucken (die ich habe gerade hinzugefügt) ... aber ... Ich erhalte die alte Liste die ganze Zeit :(

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

Die letzte Zeile gibt alte Liste der Benutzer instance.users.all(). Eg Benutzer hier nicht reflektiert werden hinzugefügt.

+1

Ist das der ursprüngliche Code? Ich meine, Ihr 'Absender' ist' Blog.users.through' während Ihre m2m 'Blog.user' nicht' Blog.users' ist. – noteness

Antwort

1

m2m_changed Signale werden in mehreren Phasen im speichern/Update-Prozess gebrannt, und es gibt ein action Argument an die Signal-Handler geliefert, der Ihnen sagt, was Bühne ist es in. Von der documentation:

Aktion

Eine Zeichenfolge, die die Art der Aktualisierung anzeigt, die auf der Beziehung erfolgt. Dies kann einer der folgenden Werte sein:

"pre_add" Wird gesendet, bevor ein oder mehrere Objekte zur Relation hinzugefügt werden.

"post_add" Wird gesendet, nachdem ein oder mehrere Objekte zur Relation hinzugefügt wurden.

"pre_remove" Wird gesendet, bevor ein oder mehrere Objekte aus der Beziehung entfernt werden.

"post_remove" Wird gesendet, nachdem ein oder mehrere Objekte aus der Beziehung entfernt wurden.

"pre_clear" Wird gesendet, bevor die Beziehung gelöscht wird.

"post_clear" Wird gesendet, nachdem die Beziehung gelöscht wurde.

Wenn Sie die pre_remove Aktion fangen dann werden Sie alle Objekte erhalten vor einige aus der Beziehung entfernt wurden. Aus diesem Grund sehen Sie eine scheinbar unveränderte Benutzerliste.

Ihr Code muss die action überprüfen, bevor Sie entscheiden, was zu tun ist. Zum Beispiel:

@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

Ich denke immer noch, dass post_add es mir nicht erlaubt die aktualisierte Liste zu sehen (zB mit neuen Benutzern Ich füge hinzu) –

Verwandte Themen