14 Stimmen

Django - Wie speichert man m2m-Daten über das post_save-Signal?

(Django 1.1) Ich habe ein Projektmodell, das seine Mitglieder mit einem m2m-Feld verfolgt. Es sieht wie folgt aus:

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, wird die ausgewählte sales_rep , sales_mgr , project_mgr usw. User s zu den Mitgliedern hinzugefügt, um die Übersicht über die Projektberechtigungen zu erleichtern. Dieser Ansatz hat bisher sehr gut funktioniert.

Das Problem, mit dem ich mich jetzt befasse, ist, wie ich die Projektmitgliedschaft aktualisieren kann, wenn eine der User FK-Felder werden über den Admin aktualisiert. Ich habe verschiedene Lösungen für dieses Problem ausprobiert, aber der sauberste Ansatz schien ein post_save Signal wie das 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)  

Allerdings ist die Project hat immer noch die gleichen Mitglieder, auch wenn ich eines der Felder über den Admin ändere! Ich hatte Erfolg beim Aktualisieren von m2m-Feldern mit meinen eigenen Ansichten in anderen Projekten, aber ich musste nie dafür sorgen, dass es auch mit dem Admin funktioniert.

Gibt es einen anderen Ansatz als ein post_save-Signal, um die Mitgliedschaft zu aktualisieren? Vielen Dank im Voraus für Ihre Hilfe!

UPDATE :

Nur zur Klarstellung: Das post_save-Signal funktioniert korrekt, wenn ich mein eigenes Formular im Frontend speichere (alte Mitglieder werden entfernt und neue hinzugefügt). Das post_save-Signal funktioniert jedoch NICHT korrekt, wenn ich das Projekt über den Admin speichere (die Mitglieder bleiben dieselben).

Ich denke, Peter Rowells Diagnose ist in dieser Situation richtig. Wenn ich das Feld "Mitglieder" aus dem Verwaltungsformular entferne, funktioniert das post_save-Signal korrekt. Wenn das Feld enthalten ist, werden die alten Mitglieder auf der Grundlage der Werte gespeichert, die zum Zeitpunkt des Speicherns im Formular vorhanden sind. Unabhängig davon, welche Änderungen ich am m2m-Feld "Mitglieder" vornehme, wenn das Projekt gespeichert wird (sei es über ein Signal oder eine benutzerdefinierte Speichermethode), wird es immer von den Mitgliedern überschrieben, die vor dem Speichern im Formular vorhanden waren. Vielen Dank für diesen Hinweis!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X