Ich brauche nur eine Bestätigung für mein Verständnis von Djangos Implementierung von ON DELETE CASCADE von Django-Experten.
Laut offizieller Django-Dokumentation:
Wenn Django ein Objekt löscht, emuliert es standardmäßig das Verhalten von die SQL-Einschränkung ON DELETE CASCADE - mit anderen Worten, alle Objekte wo Fremdschlüssel auf das zu löschende Objekt zeigen damit gelöscht.
Bedeutet das Wort "emulieren" , dass die ON DELETE CASCADE-Logik tatsächlich in Django implementiert ist und nicht auf Datenbankebene? (Ich habe in meine Datenbank hineingeschaut und alle Tabellen, die Fremdschlüssel enthalten, haben ON DELETE NO ACTION in ihren Definitionen.)
Wenn ich mein Verständnis richtig verstanden habe, kann ich die Logik ON DELETE CASCADE von der App-Ebene auf die Datenbankebene verlagern? Ich suche mehr nach einem richtigen Weg, nicht nach einem Hack, um das zu tun. (Hinweis: Ich verwende PostgreSQL als mein Backend.)
Wenn Sie fragen, wo der entsprechende Code implementiert ist: Sie finden ihn hier .
Die Implementierung der CASCADE-DELETE-Logik in der Anwendungs- / ORM-Ebene ist sinnvoll, da die App dadurch informiert werden kann, wenn eine Löschung stattfindet (z. B. Djangos Löschsignale werden für die gelöschten Instanzen ausgelöst), außerdem ist dies eine sinnvolle Möglichkeit diese Funktion für verschiedene Arten von Datenbanken.
Wenn Sie sich Sorgen um die Integrität Ihrer Daten machen: Django setzt immer noch Fremdschlüsseleinschränkungen, wenn Ihre Datenbank dies unterstützt (z. B. PostgreSQL überprüfen). Ihre Datenbank lässt Sie also keine Zeilen löschen, auf die ein Fremdschlüssel verweist.
Probieren Sie es selbst aus:
%Vor%FYI, das ist seit django 1.3 konfigurierbar: Ссылка
Grundsätzlich müssen Sie on_delete auf DO_NOTHING setzen und die Kaskadenlogik selbst zur Datenbank hinzufügen:
DO_NOTHING: Ergreifen Sie nichts. Wenn das Datenbank-Backend die referenzielle Integrität erzwingt, verursacht dies einen IntegrityError-Fehler, es sei denn, Sie fügen dem Datenbankfeld manuell eine SQL ON DELETE-Einschränkung hinzu (möglicherweise mit initial sql).
Tags und Links django django-database