##ForeignKeyとは!
Djangoのmodels.py内で利用できるリレーションフィールドの1種であり、複数モデルを扱う際にそれぞれのモデルを関連付ける役割を持っています。
ForeignKeyの場合、一対多の関係を持つフィールドを作成することが出来ます。
今回は、ブログにカテゴリ分類機能を実装する過程でForeignKeyの使い方をまとめていきます。
##図で見る!
今回のカテゴリ機能は以下のようなイメージです。字が汚くてすみません。
なんの変哲もないカテゴリ機能です。
分類するカテゴリをCategoryモデルクラスとして定義し、それぞれ1つ1つの記事をPostモデルクラスを定義します。
カテゴリの中に記事が複数まとまっている、まさに一対多の関係ですね。
以下、この関係を親と子と呼称します(親が一、子が多)
この関係を実装するため、ForeignKeyを利用します。
##コード!
class Category(models.Model):
name = models.CharField('カテゴリ', max_length = 100)
def __str__(self):
return self.name
class Post(models.Model):
category = models.ForeignKey(Category, verbose_name = 'カテゴリ', on_delete = models.PROTECT)
def __str__(self):
return self.title
##解説
ForeignKeyは、他のフィールドと同じような形で使用します。
カッコ内には引数として親となるモデル名を指定しなければいけない(今回はCategory)ほか、on_deleteも指定する必要があります。
on_delete = PROTECTとon_delete = CASCADEの2種があります。(後述します)
注意点として、ForeignKeyは子側のモデルクラスに記述する必要がある、ということです。
引数として親モデル名を指定するため、親側のモデルクラスに記入すると自身に包含されるということになってしまい変ですものね。
##PROTECTとCASCADE
この2つは、データ削除時の動作に関する記述です。
PROTECTの場合、親データの削除時に子データが存在していると削除ができない仕様になりますが、CASCADEの場合、親データを削除すると子データも一緒に削除される仕様になります。
今回はカテゴリ削除によるブログ記事削除を防ぐため、PROTECTに設定しました。
##参照
Djangoドキュメント
モデルフィールドリファレンス