2016-06-20 10 views
4

Angenommen, ich habe Django-Modelle wie A -> B -> C -> D in der Standarddatenbank.Soft löschen django Datenbankobjekte

C ein Fremdschlüssel in D ist, ähnlich wie B in C und C in A.

über die Streichung des Objekts A, ist das Standardverhalten von Django, dass alle Objekte in eine direkt oder indirekt bezogen wird, wird automatisch gelöscht werden (Bei Löschkaskade). Damit würden B, C, D automatisch gelöscht.

Ich möchte das Löschen so implementieren, dass beim Löschen eines Objekts von A es in eine andere Datenbank namens 'del' verschoben wird. Außerdem werden damit auch alle anderen verwandten Objekte von B, C, D erhalten gerührt.

Gibt es eine einfache Möglichkeit, dies auf einmal zu implementieren?

+0

Wechseln Sie in eine andere Datenbank oder Tabelle? – e4c5

+0

Eine andere Datenbank –

+0

Was ist Ihr RDBMS? – e4c5

Antwort

0

Überschreiben Sie einfach delete Methode des Modells A und überprüfen Sie die Beziehung vor dem Löschen. Wenn es nicht leer ist - verschiebe das Objekt in eine andere Tabelle/DB.

4

Ich habe dieses Ding implementiert ein gelöschtes Flag für jedes Modell meiner Datenbank anstelle von Dingen zu trennen Datenbank bewegen wie folgt:

deleted = models.BooleanField(default=False) 

und definiert für jedes Modell eine soft_del Funktion wie folgt:

def soft_del(self): 
     self.deleted = True    
     self.save() 

Also die gelöschten Modelle würden in der gleichen Datenbank existieren mit gelöschten Flag auf True gesetzt.

auch einen ON DELETE CASCADE-Effekt zu erzeugen habe ich jedes Modell so soft_del Funktionen hinzugefügt und eine related_name zu jedem Fremdschlüssel in dem Modell wie folgt angegeben:

class B(models.Model) 
    a = models.ForeignKey(A,related_name='related_Bs')) 

und dann die soft_del von Kind an, wenn innerhalb des sof_del des übergeordneten Elements wie folgt:

def soft_del_A(self): 
    self.deleted = True 
    for b in A.related_Bs.all(): 
     b.soft_del_B() 

    self.save() 
0

Es gibt eine Bibliothek, die Djangos Standard-Löschverhalten auf Soft-Löschungen entspricht. (dh verwendet die Optionen Cascade, do nothing usw. aus der Modellspezifikation).

https://github.com/upgrad/django-deletes

PS: Die Bibliothek ist noch im Beta-Modus, aber aktive Entwicklung.