LoginSignup
1
1

More than 3 years have passed since last update.

Django のモデル変更で外部キーを指定したらon_deleteを指定する必要が合った話

Posted at

Djangoで外部キーを設定しようとしたときにon_deleteで悩んだのでまとめてみました。

していたこと

現在ゲームのトーナメントを開催するwebアプリを作っているので、大会と参加者を結びつけるテーブルが必要でした。

なので参加者テーブルに大会テーブルとユーザテーブルを外部キーで持たせたモデルを作成しました。

models.py
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引数は、モデルおよび移行で必要になりました。

Django 2.0 リリースノート

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!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1