Djangoモデルにおけるon_deleteの効果とは?
By hientd, at: 2025年7月13日16:12
Estimated Reading Time: __READING_TIME__ minutes


DjangoのForeignKeyを定義する際、on_delete引数は必須です。これは、参照オブジェクトが削除された場合の処理方法をDjangoに指示します。
構文:
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
Author
が削除されると、Djangoはon_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: ユーザーモデルで一般的に使用されます。ユーザーが削除された場合、削除するのではなく、そのコンテンツをプレースホルダーの「匿名」または「削除済み」ユーザーに割り当てます。