Djangoの多対多モデル(ManyToManyField):投稿とタグを例に考える
2022.11.23
ブログなどの投稿とタグでは、一つの投稿に複数のタグがつけられます。これをモデルにすると次のようになります。
class Tag(models.Model):
name = models.CharField(unique=True, max_length=64)
description = models.TextField(blank=True)
class Post(models.Model):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
title = models.TextField(blank=False)
tags = models.ManyToManyField(Tag, related_name='posts_tags')
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
最初にタグモデルを定義し、次に投稿モデルを定義する。たぶん順番をひっくり返すとエラーになります。
今回のポイントとは直接関係ありませんが、account というフィールドに注目してください。これは投稿者のアカウントを意味しますが、複数のアカウントが一つの投稿をしているわけではないので、ForeignKey というフィールドになっていますね。
ManyToManyField
投稿モデルにタグフィールド tags を入れます。tags は ManyToManyField という特殊なフィールドです。related_name は任意ですが、たぶん多対多の関係であることを示す言葉のほうがいいと思います。
関連させるモデルのオブジェクトが一つしかないなら ForeignKey にしますが、複数なら ManyToManyField にします。
フィールド名は基本的に複数形にします。Tag というモデルのオブジェクトが複数あることを示すために tags としています。詳しくは Django の公式ページで解説されています。