web-dev-qa-db-ja.com

Django on_delete = models.CASCADEはSQLレベルでは効果がありません

私のmodels.pyファイルには次のものが含まれています。

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と入力すると、移行は失敗せずに機能します。

ここで、(SequelProを使用して)mysqlテーブルに移動し、現在セッションエントリを持っているユーザーの行を削除しようとすると、次のエラーが発生します: "One行は削除されませんでした。テーブルをリロードして、その間に内容が変更されていないことを確認してください。このテーブルの主キー内で発生する可能性のあるエラーがないかコンソールを確認してください! "。

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

どうすれば修正できますか?

19
Rakib

docs (私の強調)から:

ForeignKey.on_delete

ForeignKeyによって参照されるオブジェクトが削除されると、Djangoはon_deleteで指定されたSQL制約の動作をemulateします引数。

Djangoは実際にはデータベースにON DELETE句を設定しません。必要な場合は、 RunSQL 操作を使用して手動で追加できます。必ず同じインデックス名を使用するか、元のインデックスを保持してください。そうしないと、後でエラーが発生する可能性があります。

21
knbk