2016-03-16 7 views
6

Ich habe ein Modell Ziel, das zwei M2M-Felder hat und durch ein anderes Modell Ereignis bezeichnet wird. Jetzt ist die Anforderung so, dass Goal editierbar ist, was bedeutet, dass ich aus M2M-Feldern hinzufügen/löschen und Ereignisse hinzufügen/löschen kann. Die Bearbeitung wird jedoch moderiert, und erst nach der Genehmigung müssen die Änderungen berücksichtigt werden, oder im Falle einer Ablehnung müssen die Änderungen rückgängig gemacht werden.Django pflegen Versionen eines Modellobjekts

Ich habe durch dedecopy durchgegangen, aber es dient meinem Zweck nicht, weil sagen wir, wenn ich x=deepcopy(goal object) mache, bekomme ich Kopie des Zielobjekts, aber ich bin unsicher, was ich damit machen kann.

Dann lernte ich über model_to_dict von django.forms Modul es serialisiert das ganze Objekt, das praktisch ist. Ich dachte, dass ich dieses Wörterbuch möglicherweise verwenden könnte, um ein Modell RevisedGoal mit ursprünglichem Ziel als Fremdschlüssel zu erstellen. Ist es eine machbare Lösung? Gibt es andere Möglichkeiten, dies zu erreichen?

+0

Sind Sie fragen [wie eine Modellinstanz klonen] (http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and- Speichern Sie es auf der Datenbank)? – Sayse

+0

@Sayse Würde das Klonen mir erlauben, zwei Versionen eines Datensatzes zu verwalten? Weil ich die Verbindung durchging, die Sie gaben, bevor Sie bekanntgab –

+0

Im Wesentlichen macht es eine völlig unterschiedliche Instanz von ihm, ein Duplikat, wenn Sie, dieses würde neue Aufzeichnungen der in Verbindung stehenden Felder nicht standardmäßig aber – Sayse

Antwort

1

Ich denke, dass Sie im Wesentlichen fragen, wie Sie Änderungen an den M2M-Feldern von Goal verfolgen können, damit diese genehmigt oder rückgängig gemacht werden können. Wenn Sie diese ausstehenden Änderungen in der Datenbank für die spätere Genehmigung oder Ablehnung beibehalten müssen, ist das Klonen des Modells möglicherweise nicht die beste Lösung, insbesondere, wenn Sie die Wiederherstellung rückgängig machen möchten. Wenn Sie viele dieser Änderungen erwarten, sollten Sie die potenziellen Änderungen von den "Live" -Instanzen Ihrer Ziele und Ereignisse trennen.

Ich würde vorschlagen, ein neues Modell zu erstellen, das mit Goal verknüpft ist und diese ausstehenden Änderungen darstellt. Dieses Objekt verfolgt die hinzugefügten/entfernten Datensätze aus den M2M-Zielfeldern und könnte einige zusätzliche Felder für die Genehmigung enthalten (z. B. wer die Änderungen genehmigt hat und wann). Wenn eines dieser neuen Objekte als genehmigt markiert wird, können Sie die erforderlichen Änderungen an der ursprünglichen Goal-Instanz vornehmen.

Wie Sie die hinzugefügten/entfernten M2M-Felder verfolgen, ist der knifflige Teil. Im folgenden Beispiel habe ich entsprechende M2Ms für das ausstehende Änderungsobjekt erstellt, die Sie bei der Genehmigung durchlaufen können, um sie auf das ursprüngliche Goal-Objekt anzuwenden.

class Goal(models.Model): 
... 


class PendingGoalChange(models.Model): 
    goal = models.ForeignKey(Goal, related_name='changes') 
    approved = ... 
    approver = .... 

    added_m2m_field_instances = models.ManyToMany(...) 
    removed_m2m_field_instances = models.ManyToMany(...) 

    def approve(self): 
     self.approved = True 
     ... 
     for new_field in self.added_m2m_field_instances.all(): 
      self.goal.field.add(new_field) 
+0

Es ist mir gelungen, eine vernünftige Lösung für dieses Problem zu finden, basierend auf der Serialisierung des aktuellen Zustands und dem Wiederherstellen derselben bei einem Ablehnungsfall und dem Aktualisieren des letzten genehmigten Zustands mit dem aktuellen genehmigten Zustand. Ich hatte dieselbe Philosophie wie du gesagt hast, aber ich habe es einfach anders gemacht –

Verwandte Themen