TIL-030|Django Many to Many Fieldの使用
📝 前のデータベース・ロケーションで説明したように、Many to Many(N:N)関係には、2つのテーブルを接続し、関係を表す中間テーブルが必要です.djangoもモデル実装時に中間テーブルを作成する必要があります.中間テーブルを直接作成する方法とMantoManyFiledを使用する方法があります.
model.pyで中間テーブルを作成するクラスではなく、djangoで直接中間テーブルを作成する機能です. Queryメソッドを使用して、中間テーブルをデータ制御できます.
👉 actors moviesテーブルにデータを直接挿入して接続する必要があります.
👉 データにアクセスする場合は、中間テーブルを逆参照し、接続テーブルを介して値を取得する必要があります.これは不便です.
👉
👉 ワイルドカードを使用して、中間テーブルを制御できます.
👉 自動生成された中間テーブルにデータを挿入することは、以下の
1)中間テーブルを別途作成する必要はなく、Djangoで自動的に作成することもできます.
2) Views.pyでクラスビューを実装する場合は、中間テーブルを通過する必要がないため、コードが短く、直感的で、読みやすさが向上します.
3)Query法を用いたCRUDの方が簡便である.
Many to Many field
#직접 중간테이블을 생성한 model
class Actor(models.Model):
first_name = models.CharField(max_length=45)
last_name = models.CharField(max_length=45)
date_of_birth = models.DateField()
class Meta:
db_table = 'actors'
class Movie(models.Model):
title = models.CharField(max_length=45)
release_date = models.DateField()
running_time = models.IntegerField(default=0)
class Meta:
db_table = 'movies'
class Actor_movie(models.Model):
actor = models.ForeignKey('Actor', on_delete = models.CASCADE)
movie = models.ForeignKey('movie', on_delete = models.CASCADE)
class Meta:
db_table = 'actors_movies'
👉 Foreign Keyを使用して、中間テーブルのモデルを直接作成します.👉 actors moviesテーブルにデータを直接挿入して接続する必要があります.
👉 データにアクセスする場合は、中間テーブルを逆参照し、接続テーブルを介して値を取得する必要があります.これは不便です.
#manytomanyfield를 사용한 model
class Actor(models.Model):
first_name = models.CharField(max_length=45)
last_name = models.CharField(max_length=45)
date_of_birth = models.DateField()
class Meta:
db_table = 'actors'
class Movie(models.Model):
title = models.CharField(max_length=45)
release_date = models.DateField()
running_time = models.IntegerField(default=0)
actor = models.ManyToManyField(Actor, related_name='movies')
class Meta:
db_table = 'movies'
👉 ManyToManyField
を使用してMany to Manyモデルのモデルを実装する.pyのコードです.👉
relate_name
を使用する場合は、逆参照時に使用する_set
を使用する必要はありません.👉 ワイルドカードを使用して、中間テーブルを制御できます.
👉 自動生成された中間テーブルにデータを挿入することは、以下の
add()
によって行うことができる.# $ python manage.py shell
>>> a1 = Actor.objects.get(id=1)
>>> m2 = Movie.objects.get(id=1)
>>> m1.actor.add(a1)
>>> a2 = Actor.objects.get(id=2)
>>> m2 = Movie.objects.get(id=2)
>>> m2.actor.add(a2)
最後にManyToManyFieldを使うメリットをまとめます.1)中間テーブルを別途作成する必要はなく、Djangoで自動的に作成することもできます.
2) Views.pyでクラスビューを実装する場合は、中間テーブルを通過する必要がないため、コードが短く、直感的で、読みやすさが向上します.
3)Query法を用いたCRUDの方が簡便である.
Reference
この問題について(TIL-030|Django Many to Many Fieldの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@lck0827/TIL-031-DjangoMany-to-Many-Field의-사용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol