2016-03-03 12 views
6

Meine models.py Datei enthält:Django on_delete = models.CASCADE keine Auswirkungen auf SQL-Ebene hat

class User(models.Model): 
    email = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=100) 
    create_time = models.DateTimeField(auto_now_add=True) 

class Session(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    token = models.CharField(max_length=100, unique=True) 

Wenn ich befehle python manage.py makemigrations und dann befehlen python manage.py sqlmigrate <app_name> <migration_name> ich sehe nichts, die "ON DELETE = CASCADE"

sagt

Die Migrationen funktionieren jedoch ohne Fehler, wenn ich python manage.py migrate eingeben.

Nun, wenn ich an die MySQL-Tabelle gehen (mit SequelPro) und versuchen, eine Zeile für einen Benutzer zu löschen, die derzeit eine Sitzung Eintrag hat, erhalte ich folgende Fehlermeldung: ". Eine Zeile nicht entfernt wurde neu laden die Tabelle, um sicherzustellen, dass sich der Inhalt in der Zwischenzeit nicht geändert hat Überprüfen Sie die Konsole auf mögliche Fehler innerhalb der Primärschlüssel dieser Tabelle! ".

Wenn ich jetzt zu der Sitzungstabelle gehe und die Sitzungen dieses Benutzers lösche und dann versuche, die Zeile des Benutzers aus der Benutzertabelle zu löschen, wird sie ordnungsgemäß gelöscht. Dies zeigt an, dass ON DELETE = CASCADE nicht wirklich auf der MySQL-Ebene funktioniert.

Wie kann ich das korrigieren?

Antwort

13

Vom docs (Hervorhebung von mir):

ForeignKey.on_delete

When an object referenced by a ForeignKey is deleted, Django will emulate the behavior of the SQL constraint specified by the on_delete argument.

Django nicht wirklich gesetzt eine ON DELETE Klausel in der Datenbank. Wenn Sie eine benötigen, können Sie eine manuell mit einer Operation RunSQL hinzufügen. Stellen Sie sicher, dass Sie denselben Indexnamen verwenden oder den ursprünglichen Index beibehalten, da sonst später Fehler auftreten können.

+7

das ist so ein bummer :( –

Verwandte Themen