Django: Referentielle Integrität ändern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

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.
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

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 …?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Es gibt dafür noch keine Lösung; vlt kommt mit 1.2 nen neues Cascading verhalten, dass dann auf null setzt.
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo apollo13,

schade – aber Danke für Deine Antwort.

Grüße,
Olaf
Antworten