foreignkeyを使って外部モデルのデータを取ろうとすると、on_deleteという設定をしなければいけないですよね。
よく見るのはCASCADEという表記かと思いますが、これがよく分からないという方も多いのではないかと思います。
(CASCADEは一言で言うと一緒に消す、という意味です。のちほど詳しく解説していきます。)
そこで今回は、on_deleteの意味、種類とその使い方を解説していきます。
on_deleteの意味は?
まずはon_deleteの意味をおさえておきましょう。
on_deleteは「参照先のモデルのデータが削除されたとき、どうしますか?」という意味です。
参照先のというのが一つのポイントですので、ちょっと意識しておきましょう。
on_deleteについて、具体例をつかって理解を深めていきましょう。
まずはモデルを作る
このような2つのモデルがあったとします。
1. Bookモデル
Bookモデルは、本のタイトルと作者、発売日を集めたテーブルです。今回は、このようなデータがあったとしましょう。
タイトル | 作者 | 発売日 |
秘密 | 東野圭吾 | 2001/5/1 |
手紙 | 東野圭吾 | 2006/10/1 |
模倣犯 | 宮部みゆき | 2005/11/26 |
告白 | 湊かなえ | 2008/8/5 |
2. Authorモデル
Authorモデルは、本の作者のデータがのっています。
作者 | 生まれた年 |
東野 圭吾 | 1958年 |
宮部 みゆき | 1960年 |
湊 かなえ | 1973年 |
伊坂 幸太郎 | 1971年 |
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の効率的なスキルアップに、 是非お役立て下さい。