WEBスキル

【Django 必修スキル】model同士を紐付け(リレーション)する方法

djangoでは、違うmodel同士でもデータを紐付ける事が出来るのですが、参考書でも少し触れる程度しかないので、簡単にまとめておきます。

ちなみに、違うモデルのデータを紐付けることをリレーションと呼びます。

この記事は自身の備忘録として掲載します。

リレーションの方法

その紐付けの方法はとてもシンプルです。

例えば、以下のような2つのモデルがあるとして説明します。

class Author(models.Model):
name = models.CharField(max_length=100)

class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author,on_delete=models.CASCADE)

ここで紐付け(関連付け)をしている部分は、

author = models.ForeignKey(Author, on_delete=models.CASCADE)の部分です。

ここでは、model名:authorの中にmodel名:Bookのデータを入れています。つまり、モデルAuthorの1つのデータを親、Bookの複数データを子として関連付けることができています。

この部分にあるon_delete引数は、関連付けられたオブジェクトが削除された場合の動作を定義します。models.CASCADEを指定すると、関連付けられたオブジェクトが削除された場合、関連付けられた全てのオブジェクトも削除されます。

また、ManyToManyFieldを使うと、多対多の関係を表現できます。以下は、BookモデルとGenreモデルの多対多の関係を表現する例です。

class Book(models.Model):
title = models.CharField(max_length=100)
genres = models.ManyToManyField(Genre)

class Genre(models.Model):
name = models.CharField(max_length=100)

Bookモデルのgenresフィールドには、Genreモデルとの多対多の関係が定義されています。Djangoは、自動的に中間テーブルを作成し、BookGenreのオブジェクトを関連付けます。

これらのフィールドを定義することで、Django ORMを使用して、異なるModel同士の関連付けを行うことができます。

ABOUT ME
den
完全独学でWEBデザインを無謀にも挑戦している中年男。 工場勤務の会社員で3児の父。 チャレンジを忘れず、妻に怒られても心はおれず。 有益な情報を発信し、これを見ている人の為になればと思っています。
関連記事一覧