2016-03-03 23 views
6

models.pyファイルが含まれていますジャンゴ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) 

iはpython manage.py makemigrationsを指揮し、 "= ON DELETE CASCADEを" python manage.py sqlmigrate <app_name> <migration_name>は、私が言う何も表示されません

を指揮するとき

ただし、python manage.py migrateと入力すると、移行は正常に機能します。

ここで、SequelProを使用してmysqlテーブルにアクセスし、現在セッションエントリがあるユーザの行を削除しようとすると、次のエラーが表示されます: "1行が削除されませんでした。このテーブルのプライマリキー内で起こりうるエラーについてコンソールで確認してください! "をコンソールでチェックしてください。

私はセッションテーブルに移動してこのユーザーのセッションを削除し、ユーザーテーブルからユーザーの行を削除しようとすると、正しく削除されます。これは、ON DELETE = CASCADEが実際にMySQLレベルで動作していないことを示しています。

どうすれば修正できますか? docs(強調鉱山)から

答えて

13

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

そのようなバマーです:( –

関連する問題