다대다 관계는 한 테이블의 여러 레코드가 다른 테이블에 있는 여러 레코드와 연관되어 있는 경우에 발생한다.
위의 ERD로 풀어 설명하자면, 한 배우(actor)는 여러 영화(movie)에 출연할 수 있고, 한 영화(movie)는 여러 배우(actor)를 출연시킬 수 있기 때문에 다대다 관계이다.
django에서는 다음의 2가지 방법으로 다대다 관계의 모델을 정의할 수 있다.
ManyToManyField는 위와 같이 사용한다.
ManyToManyField를 사용하면 Django는 자동으로 다대다 관계를 나타내는 중간 조인테이블을 생성해 준다. 생성하는 테이블의 이름은 다대다 필드의 이름과 이를포함하는 모델의 테이블 이름을 사용하여 생성된다.
ManyToManyField(to, related_name=None, related_query_name=None, limit_choices_to=None, symmetrical=None, through=None, through_fields=None, db_constraint=True, db_table=None, swappable=True, **kwargs)
related_name
: 관련 개체에서 다시 이 개체로의 관계에 사용할 이름. 역참조 관계를 정참조 관계처럼 사용할 수 있다.through
: 중간 테이블을 수동으로 지정하려는 경우 이 옵션을 사용한다.db_table
: 다대다 데이터를 저장하기 위해 생성할 테이블의 이름. 사용하지 않으면 Django는 테이블과 필드 자체의 이름을 기반으로 테이블 명을 설정한다.through_field
: 명시적으로 다대다 관계에 사용할 키를 지정해준다. 다대다 관계에 참여하는 모델 중 하나에 대한 중개 모델에 둘 이상의 외래키가 있는경우 에러가 발생하는것을 방지하기 위해 사용하는 옵션이다.
⬆️ migration 파일
⬆️ migrate적용된 테이블
⬆️ 중간 테이블이 가지고 있는 column
위의 models.py로 데이터베이스에 migrate한 결과 actors_movies라는 중간 테이블이 생성되었다. actors_movies가 가지고 있는 column은 id, actor_id, movie_id이다.
⬆️ actors 테이블 속 데이터
⬆️ movies 테이블 속 데이터
add를 사용하여 중간테이블을 거치지 않고 바로 추가가 가능하다.
참고
Django | Many-to-many relationships
Django | Model field reference - ManyToManyField