django model ManyToManyField

김예랑·2021년 6월 22일
1

장고 모델에서 사용하는 여러가지 필드 (CharField, TextField, IntegerField...)들 중에
ManyToManyField가 있다.

관계형 데이터베이스에서 두 테이블이 N:N 관계에 있을 때 쓰는 필드이다.

사실 ManyToManyField를 쓰지 않고 중간 테이블을 만들어 Foreignkey를 두 개 지정하여 사용할 수도 있는데
ManyToManyField를 사용하면 장점이 몇 가지 있다.

  • 중간 테이블을 자동으로 만들어 준다.
  • 중간 테이블을 거치지 않고서도 데이터에 접근할 수 있다. (이게 편리)

모델에서 ManyToManyField 사용하기

models.py =>

class Actor(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    date_of_birth = models.DateField()
    movies = ManyToManyField('Movie')

    class Meta:
        db_table = 'actors'


class Movie(models.Model):
    title = models.CharField(max_length=45)
    release_date = models.DateField()
    running_time = IntegerField()

    class Meta:
        db_table = 'movies'

Actor클래스와 Movie클래스를 정의할 때 Actor클래스에 ManyToManyField를 설정해줬다.
(N:N관계에 있는 두 클래스 중 한 클래스에만 설정하면 된다.)

이렇게 ManyToManyField를 사용하게 되면 데이터베이스에 자동으로 중간 테이블을 만들어 준다.

데이터에 접근하는 방식 예시

  • ManytoManyField를 설정한 클래스(테이블)에서 N:N 관계인 클래스(테이블)로 접근할 때. (참조)
Actor.objects.get().movies.all() # 해당 배우의 출연 영화 모두를 쿼리셋으로 가져옴
Actor.objects.get().movies.add() # 해당 배우의 출연 영화 추가
  • ManytoManyField를 설정하지 않은 클래스(테이블)에서 N:N 관계인 클래스(테이블)로 접근할 때. (역참조)

Movie.objects.get().actor_set.all() # 해당 영화에 출연한 배우 모두를 쿼리셋으로 가져옴
Movie.objects.get().actor_set.add() # 해당 영화에 출연한 배우 추가

# _set : 접근할 클래스명에 _set을 붙여 역참조할 수 있다. (클래스명을 소문자로)

간단한 사용법만 알아봤고 상황에 맞게 필요한 사용법을 찾아 쓰면 되겠다.

profile
안녕하세요. 백엔드 애송이 백송이 김예랑 입니다.

0개의 댓글