Wo wird die ON DELETE CASCADE-Logik in Django implementiert? (PostgreSQL wird verwendet)

8

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.)

    
tamakisquare 15.07.2011, 20:17
quelle

2 Antworten

6

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%     
Bernhard Vallant 23.03.2015, 10:28
quelle
0

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).

    
related 07.12.2013 12:01
quelle

Tags und Links