TIL. Many to Many 관계를 설정이 좋은 이유

jeong_hyeon·2022년 3월 15일
1

TIL

목록 보기
12/22

✔️ 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'

1.Create 데이터를 넣을때의 차이

  • Actors와 Movie를 ManytoMany로 연결해준 경우에는 중간테이블 AcMv를 거치지 않고 add를 통해서 Actors를 통해서 바로 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 정보를 넣어줄수있다.

2.데이터를 가져올때도 차이가 있다(get)

  • Many to Many(Actors-Movie)로 연결한 경우 Actor에서 Movie 정보(정참조)를 바로 가져올 수도 있고, Movie에서도 Actor정보(역참조)를 바로 가져올 수 있다.
  • MTM 관계 설정을 안했을땐 항상 중간테이블인 AcMv를 통해서만 가져와야 한다.

  • ManyToMany 필드를 사용했을 때는 정참조 또는 역참조로 바로 접근이 가능하다.

Many To Many관계를 넣어줄때 장점은 중간테이블을 거치지 않고 언제든지 데이터를 쉽게 추가하고 가져올 수 있다는 장점이 있다.

<최소한의 데이터베이스를 거쳐서 가져오는것이 가장 좋다!>

0개의 댓글