on_deleteの意味と種類を分かりやすく解説【具体的なコード付き】

foreignkeyを使って外部モデルのデータを取ろうとすると、on_deleteという設定をしなければいけないですよね。

よく見るのはCASCADEという表記かと思いますが、これがよく分からないという方も多いのではないかと思います。

(CASCADEは一言で言うと一緒に消す、という意味です。のちほど詳しく解説していきます。)
そこで今回は、on_deleteの意味、種類とその使い方を解説していきます。
on_deleteの意味は?

まずはon_deleteの意味をおさえておきましょう。

on_deleteは「参照先のモデルのデータが削除されたとき、どうしますか?」という意味です。

参照先のというのが一つのポイントですので、ちょっと意識しておきましょう。

on_deleteについて、具体例をつかって理解を深めていきましょう。
まずはモデルを作る

このような2つのモデルがあったとします。

1. Bookモデル

Bookモデルは、本のタイトルと作者、発売日を集めたテーブルです。今回は、このようなデータがあったとしましょう。
2. Authorモデル

Authorモデルは、本の作者のデータがのっています。
Foreignkeyで二つのモデルをひもづける

ここで、Foreignkeyをつかって二つのモデルをひもづけていきます。

具体的には、Bookモデルを作るとき、Foreignkeyを使ってAuthorモデルの作者のデータを引っ張ってくるようなイメージです。
on_deleteは、参照先のデータが消えた時の動作

ここで、on_deleteの意味について改めてみていきましょう。on_deleteは、参照先のデータが消えたとき、参照元のデータをどうするか規定します。

今回の例では「Author」モデルのデータが消えたとき(例えば、「東野圭吾」)というデータが消されたとき、「Book」モデルの中の対応するデータ(「秘密」と「手紙」)をどうするのか決めるというものです。

on_deleteでできることを順番にみていきましょう。
1. CASCADE(消す)

まずは一番使われるCASCSDEです。これは、参照元のデータを削除することを意味します。

つまり、Authorモデルの中の「東野圭吾」のデータが消されると、Bookモデルの中の「秘密」「手紙」も一緒に消されてしまいます。
2. PROTECT(消させない)

次はPROTECTです。これは、参照先のデータを削除しようとすると、エラーがでます。

つまり、Authorモデルの「東野圭吾」のデータを消そうとしても、エラーが出て消すことができません。
3. SET_NULL(関係を切る)

次はSET_NULLです。これは、Foreignkeyの関係が切られます。

つまり、Authorモデルの「東野圭吾」のデータを消すと、「秘密」「手紙」のForeignkeyがnullになります。(これは、null=Trueの設定をして、nullデータを受け入れた場合にのみ使えます。)
4. SET_DEFAULT(デフォルト値を設定しておく)

次はSET_DEFAULTです。これは、Foreginkeyに新しいデータが設定されます。

5. SET(関数を通す)

次はSETです。これはSETの中で指定した関数を呼び出します。

例えば、a = models.ForeignKey(on_delete = SET(some_function))

というコードの場合、参照先のコードが消されると、some_functionが呼び出されます。
6. DO_NOTHING(何もしない)

最後はDO_NOTHINGです。これは、参照先のデータが消されても、参照元のデータには何もしません。

ただ、データベースによってはテーブル間の関係が切れた場合に何もしないとエラーが出る場合があるので、基本的にはDo_NOTHINGは使わない方がよいでしょう。

~Django無料講義~のご案内


Code for Djangoが、4時間超の無料Django講義をはじめました
 
・本を出版したCode for Djangoの
 製作者が作ったサイトです。
 
・Code for Djangoの内容も、
 動画で詳しく解説しています。
 
・動画は順次ふやしていきますので、
 ただで学び続けることが可能です。
 
・Djangoの効率的なスキルアップに、
 是非お役立て下さい。

                                                                 Django講義はこちら


Created with