2016-03-03 72 views
6

models.py文件包含:Django的on_delete = models.CASCADE具有在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) 

當我命令python manage.py makemigrations然後命令python manage.py sqlmigrate <app_name> <migration_name>我沒有看到任何東西,上面寫着 「ON DELETE CASCADE =」

但是,當我輸入python manage.py migrate時,遷移沒有失敗。現在,如果我去mysql表(使用SequelPro),並嘗試刪除當前有會話條目的用戶的一行,我得到以下錯誤:「一行未刪除。重新加載表中確認內容沒有變化檢查控制檯在此表主鍵內的可能的錯誤!「。

現在,當我進入會話表並刪除此用戶的會話,然後嘗試從用戶表中刪除用戶的行時,它會正確刪除。這表示ON DELETE = CASCADE實際上並不在MySQL級別上工作。

我該如何糾正它?

回答

13

docs(重點煤礦):

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不實際設置數據庫中的ON DELETE條款。如果您需要,可以使用RunSQL操作手動添加一個。請務必使用相同的索引名稱,或保留原始索引,否則稍後可能會遇到錯誤。

+7

這就是這樣一個無賴:( –