親テーブルと子テーブル
DjangoのORM(オブジェクト関係マッピング)において、テーブル間の関係は親子関係として定義されます。親テーブルは「一側テーブル」、子テーブルは「多側テーブル」とも呼ばれます。例として、Magazine(雑誌)とArticle(記事)という2つのモデルを考えてみましょう。1つのMagazineには複数のArticleが含まれるとします。
class Magazine(models.Model):
title = models.CharField(max_length=100)
publisher = models.CharField(max_length=50)
class Article(models.Model):
magazine = models.ForeignKey(Magazine, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
content = models.TextField()
publish_date = models.DateTimeField()
author = models.ForeignKey(Writer, on_delete=models.CASCADE)
上記のコードでは、Magazineが親テーブル、Articleが子テーブルです。
以下の点に注意が必要です:
- 子テーブルは、親テーブルへの関連を明確にするために
ForeignKeyを定義する必要があります。上記の例では、Articleモデルのmagazineフィールドがそれに該当します。 - 親テーブルのオブジェクトは、関連する子テーブルの全オブジェクトに、
article_setのような逆参照名を通じてアクセスできます。例えば、magazine.article_set.all()は、特定のmagazineに属するすべてのArticleオブジェクトを取得します。 ForeignKeyを定義する際、on_deleteパラメータを指定する必要があります。これは、関連する親キーが削除された場合に、子テーブルの関連レコードをどのように処理するかを示します。
ForeignKeyのon_deleteオプション
Djangoで他のモデルへの外部キーを定義する際、ForeignKeyフィールドのon_delete属性を指定する必要があります。この属性は、関連するオブジェクトが削除された場合に、外部キーの値をどのように処理するかを定義します。on_deleteの値は文字列で、以下のオプションが利用可能です:
CASCADE: 関連するオブジェクトが削除されると、このオブジェクトも一緒に削除されます。これは最も一般的な動作です。
PROTECT: 外部キーで参照されているオブジェクトの削除を防ぎます。削除を試みると、DjangoはProtectedErrorを発生させます。
SET_NULL: 外部キーの値をNULLに設定します。ただし、関連するモデルのnull=Trueが設定されている場合にのみ使用できます。これは、外部キーが参照するオブジェクトが削除された場合、外部キーは何も参照しなくなることを意味します。
SET_DEFAULT: 外部キーの値をデフォルト値に設定します。関連するモデルにdefaultパラメータが設定されている場合にのみ使用できます。関連オブジェクトが削除されると、Djangoは関連モデルのdefault値を使用して現在の外部キーを置き換えようとします。
SET(): 外部キーの値を指定された値に設定します。関連するモデルのnull=Trueまたはdefaultパラメータが設定されている場合にのみ使用できます。SET()は、新しい外部キーの値を計算するための呼び出し可能なオブジェクトを引数に取ります。
DO_NOTHING: 何もしません。この場合、外部キーで参照されているオブジェクトを削除しようとすると、整合性エラーが発生し、データベースの動作はデータベースエンジンレベルで定義されます。これにより、Djangoの動作がデータベースの期待する動作と異なる可能性があり、潜在的な問題を引き起こすことがあります。
on_deleteの選択は非常に重要です。これは、孤立したデータの発生を防ぎます。各Djangoプロジェクトは異なる要件を持つため、プロジェクトのニーズに応じて適切な動作を選択する必要があります。