Djangoで外部キーを設定しようとしたときにon_deleteで悩んだのでまとめてみました。
していたこと
現在ゲームのトーナメントを開催するwebアプリを作っているので、大会と参加者を結びつけるテーブルが必要でした。
なので参加者テーブルに大会テーブルとユーザテーブルを外部キーで持たせたモデルを作成しました。
from django.db import models
from django.contrib.auth.models import User
from games.models import Game
class Participations(models.Model):
Game = models.ForeignKey(Game)
User = models.ForeignKey(User)
起きたこと
マイグレーションで以下のエラーが発生
Traceback (most recent call last):
Game = models.ForeignKey(Game)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
on_deleteが無いと怒られてしまいました。
原因
原因は単純ですが引数にon_deleteを指定していないことが原因です。
ちなみにDjango2.0から必須になったらしい。
実際に公式のリリースノートを見るとこのように書いています。
The on_delete argument for ForeignKey and OneToOneField is now required in models and migrations.
翻訳
ForeignKeyおよびOneToOneFieldのon_delete引数は、モデルおよび移行で必要になりました。
on_deleteの使い方
ではon_deleteとは何でしょう。
参照しているオブジェクトが削除するときの振る舞いです
以下に公式リファレンスをもとに簡単にまとめました
on_delete=models.CASCADE
外部キーのデータも全部削除しちゃうZe!
on_delete=models.PROTECT
削除を出来なくするZe!
on_delete=models.SET_NULL
削除されたら変わりにNULLを入れるよ!これを使う時はnull=trueにはしておこうZe!
on_delete=models.SET_DEFAULT
削除されたらデフォルトの値を変わりに入れるZe!
on_delete=models.SET(hogehoge)
削除されたら関数などを呼び出して任意の値を入れれるZe!
on_delete=models.DO_NOTHING
何もしないZe!
まとめ
目的に合ったon_deleteを入れて豊かなマイグレーションライフだZe!