Djangoモデルにおけるon_deleteの効果とは?

By hientd, at: 2025年7月13日16:12

Estimated Reading Time: __READING_TIME__ minutes

What Does on_delete Do on Django Models?
What Does on_delete Do on Django Models?

DjangoのForeignKeyを定義する際、on_delete引数は必須です。これは、参照オブジェクトが削除された場合の処理方法をDjangoに指示します。

 

構文:

 

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

 

Authorが削除されると、Djangoon_deleteで定義されたルールに従って、関連するBookにどのような処理を行うかを決定します。

 

一般的なon_deleteオプション

 

オプション 説明
CASCADE 関連オブジェクトも削除する(例:著者が削除された場合、すべての書籍を削除する)
PROTECT 参照オブジェクトの削除を防ぐ。ProtectedErrorを発生させる
SET_NULL 外部キーをNULLに設定する(null=Trueが必要)
SET_DEFAULT フィールドのデフォルト値に設定する
SET() 呼び出し可能なオブジェクトの結果に設定する(例:SET(get_sentinel_user)
DO_NOTHING 何もしない(データベースが空の外部キーをサポートしていない場合、エラーが発生する可能性があります)
RESTRICT (Django 3.1+) 関連オブジェクトが存在する場合、削除を防ぐ

 

例:

 

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)

 

この場合、著者が削除されると、書籍の著者フィールドはNULLに設定されます。

 

よくある質問(FAQ)

 

Q1. Djangoでon_deleteは必須ですか?

 

A: はい。Django 2.0以降、ForeignKeyまたはOneToOneFieldを使用する際には、on_deleteの動作を定義することが必須です。

 

Q2. 最も安全なon_deleteオプションは何ですか?

 

A: PROTECTは一般的に最も安全です。参照オブジェクトの誤削除を防ぎます。RESTRICT(Django 3.1+)も同様ですが、より複雑なルールに対して柔軟性があります。

 

Q3. null=TrueなしでSET_NULLを使用できますか?

 

A: いいえ。SET_NULLを使用する場合は、フィールドにもnull=Trueを宣言する必要があります。そうしないと、Djangoはエラーを発生させます。

 

Q4. CASCADEとSET_NULLの違いは何ですか?

 

A:

 

  • CASCADEは関連オブジェクトも削除します。
     

  • SET_NULLは関連オブジェクトは保持しますが、削除されたオブジェクトへの参照をクリアします。

 

Q5. DO_NOTHINGを使用するとどうなるのですか?

 

A: Djangoは何もしません。しかし、データベースが空の外部キーをサポートしていない場合、IntegrityErrorが発生します。削除処理を手動で処理する必要があります。

 

Q6. SET(get_sentinel_user)の現実世界のユースケースは何ですか?

 

A: ユーザーモデルで一般的に使用されます。ユーザーが削除された場合、削除するのではなく、そのコンテンツをプレースホルダーの「匿名」または「削除済み」ユーザーに割り当てます。

 

Tag list:

Subscribe

Subscribe to our newsletter and never miss out lastest news.