2016-03-03 32 views
6

Mój plik models.py zawiera:Django on_delete = models.CASCADE nie ma wpływu na poziomie SQL

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) 

Kiedy rozkazuję python manage.py makemigrations a następnie polecenie python manage.py sqlmigrate <app_name> <migration_name> nie widzę niczego, co mówi "ON DELETE CASCADE ="

Jednak migracje działają bezawaryjnie, gdy wpisuję python manage.py migrate.

Teraz, gdy idę do tabeli mysql (używając SequelPro) i starają się usunąć wiersz dla użytkownika, który aktualnie posiada wpis sesji, pojawia się następujący błąd: ". Jeden rząd nie został usunięty Odśwież tabela, aby upewnić się, że zawartość nie zmieniła się w międzyczasie. Sprawdź w konsoli, czy nie występują błędy w kluczach podstawowych tej tabeli: ".

Teraz, kiedy przechodzę do tabeli sesji i usuwam sesje tego użytkownika, a następnie próbuję usunąć wiersz użytkownika z tabeli użytkownika, usuwa on poprawnie. Oznacza to, że ON DELETE = CASCADE nie działa na poziomie MySQL.

Jak mogę to poprawić?

Odpowiedz

13

Z docs kopalni (nacisk):

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 nie faktycznie ustawić ON DELETE zapis w bazie danych. Jeśli go potrzebujesz, możesz dodać go ręcznie przy użyciu operacji RunSQL. Upewnij się, że używasz tej samej nazwy indeksu lub zachowujesz oryginalny indeks, lub możesz później napotkać błędy.

+7

czyli taki bummer :( –