[django] Many To Many Field(M2M)

김은지·2022년 2월 20일
0

메모 및 노트

목록 보기
18/22

장고 프로젝트를 연습하며...
다대다(Many To Many) 관계를 설정할 때
'중간테이블'을 만들고, 각각 연관지어줄 테이블의 '프라임키' 값을 중간테이블에 foreign키로 지정하여 연결해주면 된다고만 알고 있었는데...

M2M Field를 사용하면, 서로를 참조하여 데이터를 가져올 때 더 간단한 코드를 사용할 수 있다!
(무척 헷갈린다...)

아래의 예를 보자!

위의 ERD를 참고하여 M2M 필드를 활용해 models.py를 작성하면...

from django.db import models

class Movie(models.Model):
    title        = models.CharField(max_length=50)
    release_date = models.DateField()
    running_time = models.IntegerField()
    
    class Meta:
        db_table = 'movies'

class Actor(models.Model):
    first_name    = models.CharField(max_length=50)
    last_name     = models.CharField(max_length=50)
    date_of_birth = models.DateField()
    movie         = models.ManyToManyField(Movie, through='ActorMovie', related_name='actors')
    # 주로 데이터를 더 많이 꺼내오는 테이블에서 M2M필드를 활용해 콜론을 만들어준다.
    # 내가 이해하기로는 대략 이런 뜻...
    # '나 'Movie' 테이블에서 데이터 꺼내올건데, ActorMovie 테이블을 거칠거고(through), Movie 테이블에서 'Actor'인 나에게 접근할 때는 actors를 쓰도록해!_!' 
    class Meta:
        db_table = 'actors'


# M2M필드를 이용하면 중간테이블을 만들지 않아도 되지만
# 중간테이블을 명시해서 만드는 이유는
# 중간테이블에 또 다른 콜론을 추가하는 등의 추가 작업이 가능하고
# 유지보수가 쉽다!

class ActorMovie(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키를 쓰고 중간테이블을 만드는게 똑같은데 왜 M2M을 써야한다는 건지
헷갈렸는데

블로그 글을 정리하며 조금이나마 M2M필드의 장점을 머리에 안착시켰다.

  • 중간테이블을 거치지 않고 데이터를 꺼내올 수 있다는 것!

처음에는 M2M 필드가 '중간테이블에 데이터를 넣어준다'고 생각했는데 그건 아니었다.

다만 저 M2M 필드가 objects같은 manager의 역할을 해서 중간테이블을 거치지 않고 데이터를 꺼내올 수 있다.

...끝! 다음에 또 뭔가 장점을 찾아내면 기록하기로 한다.


M2M필드를 사용했을 때와 안 했을 때의 코드를 비교해서 정리해 놓은 동기의 블로그가 있어서 링크를 남긴다.
장고 앱 만들기 실습과정도 잘 정리해 두었기 때문에 방문해서 읽어보시기를 권한다.
Django - ManytomanyField와 기본적인 app (2)

0개의 댓글