Djangoでモデルクラスを外部キーで関連付けてみましょう。モデルクラスのリレーション(関係性)には「一対一」「多対一」「多対多」の3パターンがあります。
一対一のリレーション
Djangoでモデルクラスを外部キーで一対一で関連付ける場合、OneToOneField フィールドを使用します。
from django.db import models class Author(models.Model): name = models.CharField(max_length=50) # ... class Book(models.Model): title = models.CharField(max_length=100) author = models.OneToOneField(Author, on_delete=models.CASCADE) # ...
OneToOneField フィールドは、外部キーの設定に加えて、on_delete オプションを指定する必要があります。
on_delete オプションは、関連付けられたオブジェクトが削除された場合の動作を指定します。
一対一の関係では、models.CASCADE を指定することが一般的です。これは、関連付けられたオブジェクトが削除された場合、関連するオブジェクトも一緒に削除されることを意味します。
関連付けられたオブジェクトにアクセスするには、関連するモデルのインスタンスからフィールドを参照します。
例えば、Book モデルのインスタンス book から、関連する Author モデルのインスタンスを取得するには、book.author を使います。
多対一のリレーション
Djangoでモデルクラスを外部キーで多対一で関連付ける場合、ForeignKey フィールドを使用します。
from django.db import models class Author(models.Model): name = models.CharField(max_length=50) # ... class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE) # ...
ForeignKey フィールドは、関連付けたいモデルクラスを引数に取ります。
また、on_delete オプションを指定する必要があります。on_delete オプションは、関連付けられたオブジェクトが削除された場合の動作を指定します。
多対一の関係では、models.CASCADE を指定することが一般的です。これは、関連付けられたオブジェクトが削除された場合、関連するオブジェクトも一緒に削除されることを意味します。
関連付けられたオブジェクトにアクセスするには、関連するモデルのインスタンスからフィールドを参照します。
例えば、Book モデルのインスタンス book から、関連する Author モデルのインスタンスを取得するには、book.author を使います。
逆に、Author モデルのインスタンス author から、関連する Book モデルの一覧を取得するには、author.book_set.all() を使います。book_set は、Book モデルの関連名(デフォルトでは、モデル名_set)を表しています。
多対多のリレーション
Djangoでモデルクラスを外部キーで多対多で関連付ける場合、ManyToManyField フィールドを使用します。
from django.db import models class Author(models.Model): name = models.CharField(max_length=50) # ... class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) # ...
ManyToManyField フィールドは、関連付けたいモデルクラスを引数に取ります。
また、through オプションを指定することで、中間テーブルをカスタマイズすることができます。
デフォルトでは、Djangoが自動的に中間テーブルを作成します。
関連付けられたオブジェクトにアクセスするには、関連するモデルのインスタンスからフィールドを参照します。
例えば、Book モデルのインスタンス book から、関連する Author モデルの一覧を取得するには、book.authors.all() を使います。
逆に、Author モデルのインスタンス author から、関連する Book モデルの一覧を取得するには、author.book_set.all() を使います。
book_set は、Book モデルの関連名(デフォルトでは、モデル名_set)を表しています。