Django で 1 対多の関係を表す
データベースはほとんどどこでも重要な役割を果たしており、Web 開発がそのような場所の 1つであることは当然のことです。SQL を使用してテーブルを構築し、テーブル間の関係を設定するのは簡単な作業ですが、Django ではさらに簡単になります。
この記事では、Django で 1 対多の関係を表す方法を紹介します。
ジャンクション/中間モデルを使用して 1 対多の関係を表す
以下のモデルの定義を参照してください。
class Number(models.Model):
number = models.CharField(max_length=10)
class Person(models.Model):
name = models.CharField(max_length=200)
class PersonNumber(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="numbers")
number = models.ForeignKey(Number, on_delete=models.CASCADE, related_name="person")
Number
モデルには、電話番号を格納するためのフィールド number
があります。
Person
モデルには、人の名前のフィールド name
があります。
PersonNumber
は、Number
と Person
のジャンクションまたは中間モデルです。外部キーは、参照されるオブジェクトとカスケード関係にあります。このモデルは、多対多の関係だけでなく、1 対多の関係を設定するために使用できます。
すべてのモデルのデフォルトの主キーは、整数の自動フィールドである id
です。
電話番号は 1 人の人にのみ関連付けられていますが、1 人が複数の電話番号を持つことができるため、これは 1 対多の関係です。PersonNumber
は、この関係を表すために使用されます。
変数 person
が Person
オブジェクトを格納している場合、次のステートメントを使用して、この人物のすべての電話番号に簡単にアクセスできます。
numbers = person.numbers.objects.all()
このステートメントは、Number
オブジェクトの QuerySet
を返します。
この例を考えてみましょう。
ID | Person | Number |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
5 | 2 | 5 |
6 | 2 | 6 |
7 | 3 | 7 |
id
1
の人は、id
1
、2
、3
、および 4
の 4つの電話番号を持っています。
id
2
の人は、id
5
と 6
の 2つの電話番号を持っています。
id
3
の人は、id
7
の電話番号を 1つだけ持っています。
外部キーを使用して 1 対多の関係を表す
以下のモデルの定義を参照してください。
class Person(models.Model):
name = models.CharField(max_length=200)
class Number(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
number = models.CharField(max_length=10)
Person
モデルには、人の名前のフィールド name
があります。
Number
モデルには、電話番号と Person
モデルへの外部キー参照を格納するためのフィールド number
があります。このフィールドには、この番号の所有者が格納されます。外部キーは、参照されるモデル Person
とカスケード関係にあります。
この構造を使用すると、外部キー参照を使用して、各 Number
オブジェクトをそれぞれの所有者に簡単に関連付けることができます。
変数 person
が Person
オブジェクトを格納している場合、次のステートメントを使用して、この人物に関連付けられているすべての番号にアクセスできます。
numbers = Number.objects.filter(person=person)
このステートメントは、Number
オブジェクトの QuerySet
を返します。