(Django 1.1) Ich habe ein Projektmodell, das seine Mitglieder über ein m2m-Feld verfolgt. Es sieht wie folgt aus:Django - Wie speichere ich m2m Daten über post_save Signal?
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) ...
Wenn das Projekt erstellt wird, das ausgewählte sales_rep
, sales_mgr
, project_mgr
, etc User
s an die Mitglieder hinzugefügt werden, um es einfacher den Überblick über Projektberechtigungen zu halten. Dieser Ansatz hat bisher sehr gut funktioniert.
Das Problem, mit dem ich es jetzt zu tun habe, ist, wie man die Mitgliedschaft des Projekts aktualisiert, wenn eines der User
FK-Felder über den Admin aktualisiert wird. Ich habe verschiedene Lösungen für dieses Problem versucht, aber der sauberste Ansatz schien ein post_save
Signal wie das zu sein, folgende:
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)
jedoch die Project
hat immer noch die gleichen Elemente, auch wenn ich eines der Felder verändern, über die Administrator! Ich hatte Erfolg beim Aktualisieren der m2m-Felder der Mitglieder, indem ich meine eigenen Ansichten in anderen Projekten verwendete, aber ich musste nie dafür sorgen, dass es auch mit dem Admin gut spielte.
Gibt es einen anderen Ansatz, den ich anders als ein post_save-Signal nehmen sollte, um die Mitgliedschaft zu aktualisieren? Vielen Dank im Voraus für Ihre Hilfe!
UPDATE:
Nur um zu klären, das post_save Signal richtig funktioniert, wenn ich meine eigene Form im vorderen Ende (alte Mitglieder entfernt und neue hinzugefügt) speichern. Das post_save-Signal funktioniert jedoch NICHT korrekt, wenn ich das Projekt über den Admin speichere (Mitglieder bleiben gleich).
Ich denke, dass Peter Rowells Diagnose in dieser Situation richtig ist. Wenn ich das Feld "Mitglieder" aus dem Admin-Formular entferne, funktioniert das Signal post_save korrekt. Wenn das Feld eingeschlossen ist, speichert es die alten Mitglieder basierend auf den Werten, die zum Zeitpunkt des Speicherns im Formular vorhanden sind. Unabhängig davon, welche Änderungen ich am membermember-Feld members mache, wenn das Projekt gespeichert wird (ob es sich um eine Signal- oder eine benutzerdefinierte Speichermethode handelt), wird es immer von den Mitgliedern überschrieben, die vor dem Speichern im Formular vorhanden waren. Danke, dass du das unterstrichen hast!
Ich weiß nicht, ob dies Ihr Problem ist, aber ich habe ein Bauchgefühl, dass Sie in ein Artefakt, wie die Formulare Code ausgeführt werden kann, aktualisiert m2m info. Im Grunde speichern sie zunächst das Hauptobjekt, dann setzen sie die m2m-Werte, indem sie zuerst alle löschen und dann basierend auf den Werten * in der Form * setzen. Dies geschieht * nach * dem save() auf dem Hauptobjekt, also wird alles, was Sie im save() oder auf dem 'post_save' Signal machen, erst erledigt und dann * rückgängig gemacht *. Dies ist in 'django.forms.models.save_instance()'. Es wäre schön, wenn es ein 'after_form_save'-Signal gäbe. –
Danke, Peter! Ich glaube, deine Diagnose ist richtig. Ich habe meinen ursprünglichen Beitrag aktualisiert, um diese Informationen hinzuzufügen. –
Peter hat Recht. Ich hatte das gleiche Problem und einen Workaround gefunden, aber es ist nicht ein ordentliches als 'after_form_save' Signal: http://StackOverflow.com/Questions/3652585/Simple-Django-Form-Model-Save-Question –