Seite 1 von 1

Django: Referentielle Integrität ändern

Verfasst: Dienstag 25. August 2009, 12:36
von filchos
Hallo,

ich benutze Django und MySQL mit InnoDB.

In einer Tabelle `user` gibt es ein Feld `promoter_id`, welches wieder auf `user`verweist. Im Modell steht:

Code: Alles auswählen

promoter = models.ForeignKey('self', blank=True, null=True, default=None)
Ich möchte hier allerdings die Art der Referentiellen Integrität ändern.

Löscht man aktuell einen Benutzerdatensatz über die Admin-Oberfläche, so wird man gefragt, ob die Datensätze, die den aktuellen referenzieren, mit gelöscht werden sollen. Dies passiert auch, wenn man per SQL den Constraint auf der `user`-Tabelle in der DB löscht.

Löscht man den gleichen Benutzerdatensatz über die Shell, so werden die abhängigen User stillschweigend mit gelöscht. Die Logik steckt also im Modell.

Statt dessen möchte ich aber, dass die Datensätze, die den aktuellen referenzieren, erhalten bleiben und `promoter_id` auf NULL gesetzt wird.

Zusätzlich möchte ich, dass Löschvorgänge Exceptions werfen, wenn Abhängigkeiten bestehen, anstatt diese still mit zu löschen.

Ist so etwas möglich und wie geht das? Die Django-Doku schweigt sich leider über das Thema „Referentielle Integrität“ aus.

Danke und Grüße,
Olaf

P.S.: Ich kann natürlich immer noch aus dem Feld ein Integer machen und die gesamte Logik selbst schreiben. Ich hoffe aber auf eine bessere Lösung.

Verfasst: Dienstag 25. August 2009, 12:54
von filchos
Hallo,

mein erster Workaround nach http://fragmentsofcode.wordpress.com/20 ... y-default/:

In der User-Klasse:

Code: Alles auswählen

def delete(self):
    User.objects.filter(promoter=self).update(promoter=None)
    super(User, self).delete()
Aber so wirklich schön finde ich es nicht, zumal das Admininterface von dieser Änderung natürlich nichts weiß und immer noch behauptet, es lösche abhängige User.

Bessere Vorschläge …?

Verfasst: Mittwoch 26. August 2009, 18:41
von apollo13
Es gibt dafür noch keine Lösung; vlt kommt mit 1.2 nen neues Cascading verhalten, dass dann auf null setzt.

Verfasst: Sonntag 30. August 2009, 22:11
von filchos
Hallo apollo13,

schade – aber Danke für Deine Antwort.

Grüße,
Olaf