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

    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の効率的なスキルアップに、
       是非お役立て下さい。