Django Modelle handhaben im Allgemeinen die ON DELETE CASCADE Verhalten durchaus angemessen (in einer Weise, die auf Datenbanken arbeitet, die es nicht nativ unterstützt.)Welche Möglichkeiten gibt es, um Djangos kaskadierendes Löschverhalten zu überschreiben?
Allerdings bin ich kämpfen, um zu entdecken, was der beste Weg ist, diese zu überschreiben Verhalten, wo es nicht angebracht, in den folgenden Szenarien zum Beispiel:
ON RESTRICT DELETE (dh verhindern das Löschen eines Objekts, wenn es Kind Aufzeichnungen hat)
ON DELETE SET NULL (dh nicht Löschen Sie einen untergeordneten Datensatz, aber setzen Sie den übergeordneten Schlüssel auf NULL inst EAD, um die Beziehung zu brechen)
Aktualisieren Sie andere verwandte Daten, wenn ein Datensatz gelöscht wird (z. ein hochgeladenes Bild-Datei)
Die folgende löschen die möglichen Wege sind diese, die ich bin mir dessen bewusst zu erreichen:
Aufschalten des Modells
delete()
Methode. Während diese Art von Arbeiten, wird es umgangen, wenn die Datensätze über eineQuerySet
gelöscht werden. Außerdem muss jedes Modelldelete()
außer Kraft gesetzt werden, um sicherzustellen, dass der Django-Code nie aufgerufen wird undsuper()
nicht aufgerufen werden kann, da er möglicherweiseQuerySet
verwendet, um untergeordnete Objekte zu löschen.Signale verwenden. Dies scheint ideal zu sein, wie sie beim direkten Löschen des Modells oder Löschen über ein QuerySet genannt werden. Es gibt jedoch keine Möglichkeit zu verhindern, dass ein untergeordnetes Objekt gelöscht wird. Daher ist es nicht möglich, ON CASCADE RESTRICT oder SET NULL zu implementieren.
eine Datenbank-Engine verwenden, die diese richtig behandelt (was macht Django in diesem Fall tun?)
Warten Sie, bis Django unterstützt (und mit Fehlern leben, bis dann ...)
Es scheint, als wäre die erste Option die einzig mögliche, aber sie ist hässlich, wirft das Kind mit dem Bade aus und riskiert etwas zu verpassen, wenn ein neues Modell/eine neue Beziehung hinzugefügt wird.
Fehle ich etwas? Irgendwelche Empfehlungen?
+1:
Die einfachste mögliche Szenario in Ihrem Modell FK Felddefinition fügen Sie einfach. – whusterj