장고 모델에서 사용하는 여러가지 필드 (CharField, TextField, IntegerField...)들 중에
ManyToManyField가 있다.
관계형 데이터베이스에서 두 테이블이 N:N 관계에 있을 때 쓰는 필드이다.
사실 ManyToManyField를 쓰지 않고 중간 테이블을 만들어 Foreignkey를 두 개 지정하여 사용할 수도 있는데
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를 사용하게 되면 데이터베이스에 자동으로 중간 테이블을 만들어 준다.
Actor.objects.get().movies.all() # 해당 배우의 출연 영화 모두를 쿼리셋으로 가져옴
Actor.objects.get().movies.add() # 해당 배우의 출연 영화 추가
Movie.objects.get().actor_set.all() # 해당 영화에 출연한 배우 모두를 쿼리셋으로 가져옴
Movie.objects.get().actor_set.add() # 해당 영화에 출연한 배우 추가
# _set : 접근할 클래스명에 _set을 붙여 역참조할 수 있다. (클래스명을 소문자로)
간단한 사용법만 알아봤고 상황에 맞게 필요한 사용법을 찾아 쓰면 되겠다.