✔️ ManyToManyField를 사용하면, 중계모델이 필요없다. 알아서 Django에서 만들어주기 때문에 간편하다.
✔️ 또한 N:N 관계일 때는 ManyToManyField를 사용하는 것이 더 직관적으로 알아보기 쉽다.
✔️ 뿐만아니라 여러 relation이 함께 존재할 때, through, through_field 옵션을 가지고 제어할 수 있다.
중간테이블을 만들어주고 각해당 필드를 FK로 연결해도 상관없다.
근데 굳이 MtoM을 사용하는 이유는 뭘까?
#models.py
from django.db import models
# Create your models here.
class Actors(models.Model):
first_name = models.CharField(max_length=45)
last_name = models.CharField(max_length=45)
date_of_birth = models.DateField()
movies = models.ManyToManyField('Movie',through='AcMv',related_name='actor_movie')
#through 사용이유 : 다대다 관계를 나타낼 때, custom 한 중개모델을 지정할 때 사용한다.through='AcMv'
class Meta:
db_table = 'actors'
class Movie(models.Model):
title = models.CharField(max_length=45)
relese_date = models.DateField()
running_time = models.IntegerField()
class Meta:
db_table = 'movies'
class AcMv(models.Model):
actor=models.ForeignKey('Actors', on_delete=models.CASCADE)
movie=models.ForeignKey('Movie', on_delete=models.CASCADE)
class Meta:
db_table = 'actor_movie'
In [2]: c2 = Movie.objects.get(id=1)
In [5]: a1 = Actors.objects.create(first_name='get',last_name='Get',date_of_birt
...: h='2321-03-31')
In [8]: AcMv.objects.create(actor=a1, movie=c2)
Out[8]: <AcMv: AcMv object (9)>
중간테이블인 (AcMv)를 통해 정보를 넣어주는경우 add 를 통해서 바로 삽입이 가능하고 한번에 여러 객체를 담을 수 있다.
In [10]: a2 = Actors.objects.get(id=3)
In [11]: m2 = Movie.objects.get(id=3)
In [12]: a2.movies.add(m2)
Actors를 통해 바로 Movie 정보를 넣어줄수있다.
Many To Many관계를 넣어줄때 장점은 중간테이블을 거치지 않고 언제든지 데이터를 쉽게 추가하고 가져올 수 있다는 장점이 있다.
<최소한의 데이터베이스를 거쳐서 가져오는것이 가장 좋다!>