ForeignKeyを利用して、「1対多」のリレーションを持つモデルを構築します。
異なるモデル(テーブル)を、ForeignKeyを利用して「1対多」の関係において結びつけます。また、管理サイト(admin)で外部キー制約の確認をしてみます。
本記事では下記イラストのような関係を持つ2つのモデルを用意します。Clubが親でMemberが子の関係となります。ForeignKeyは子側に設定します。
models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from django.db import models class Club(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Member(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() club = models.ForeignKey(Club, on_delete=models.CASCADE) def __str__(self): return self.name + ' ' + self.club.name |
14行目
親となるモデル(Club)を指定しています。「on_delete=〜」には親のデータを削除する場合の挙動を設定します。models.CASCADEを設定すると、親側のデータを削除すると、結び付いた子側のデータも連動して削除されます(後述)。
管理サイトでの挙動確認
Memberの画面です。
memberを追加する画面で、Clubフィールドの内容が選択(および追加)できるようになります。
「on_delete=models.CASCADE」の場合、Clubの任意のデータを削除すると、結びついた子であるMember側のオブジェクトも連動して削除されます。下記画像は、あらかじめ野球クラブに花子と次郎メンバーが属している状態において、野球クラブを削除しようとする画面です。「はい」を押下すると、両メンバー自体のデータも連動して削除されます。
他の設定として、例えば「on_delete=〜」にmodels.PROTECTを指定すると、結びついた子データがある場合には、親データは削除不可となります(他の設定は 引数 を参照)。もし野球クラブを削除したい場合は、あらかじめ次郎と花子をメンバーから削除しておく必要があります。
参照ページ
django ドキュメント
モデルフィールドリファレンス