Many to many relationships(N:M or M : N)
한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우
※ 양쪽 모두에서 N:1 관계를 가짐
M:N 관계의 역할과 필요성 이해하기
병원 진료 시스템 모델 관계를 만들며 M:N 관계의 역할과 필요성 이해하기
환자와 의사 2개의 모델을 사용하여 모델 구조 구상하기
→ 제공된 'pp-mtm-practice' 프로젝트를 기반으로 진행
N:1의 한계
Django에서는 'ManyToManyField'로 중개 모델을 자동으로 생성
ManyToManyField()
M:N 관계 설정 모델 필드
만약 예약정보에 병의 증상, 예약일 등 추가 정보가 포함되어야 한다면?
Many to many field
실제 물리적 field를 생성하지는 않음 -> 환자 쪽에 필드 하나를 생성하지 않음
다대다 관계에서는 서로에게 종속되지 않음
어떤 매개체를 앞에 작성하느냐에 따라 관점이 바뀔 수 있음
환자 입장에서 의사를 조회
patient.doctors.all()
의사 입장에서 환자를 조회
doctor.patient_set.all()
'through' argument
중개 테이블에 '추가 데이터'를 사용해 M : N 관계를 형성하려는 경우에 사용
M : N 관계 주요 사항
M : N 관계로 맺어진 두 테이블에는 물리적인 변화가 없음
ManyToManyField는 중개 테이블을 자동으로 생성
ManyToManyField는 M : N 관계를 맺는 두 모델 어디에 위치해도 상관 없음
N:1은 완전한 종속의 관계였지만, M : N은 종속된 관계가 아니며 '의사에게 진찰받는 환자 & 환자를 진찰하는 의사' 이렇게 2 가지 형태 모두 표현 가능
ManyToManyField(to, options)**
M : N 관계 설정 시 사용하는 모델 필드
ManyToManyField의 대표 인자 3가지
related_name:
through:
symmertrical(내일):
역참조 매니저를 바꾸면, 두개의 작성 폼을 유사하게 바꿀 수 있음 (doctor.patients.all()) → related_name 활용
M:N에서의 대표 methods
add()
(이미 존재하는 관계에 사용하면 관계가 복제되지 않음)
remove()
모델 관계 설정
Many to many relationships
한 테이블의 0 개 이상의 레코드가 다른 테이블의 0 개 이상의 레코드와 관련된 경우
※ 양쪽 모두에서 N:1관계를 가짐
Article(M) - User(N)
0개 이상의 게시글은 0명 이상의 회원과 관련
게시글은 회원으로부터 0개 이상의 좋아요를 받을 수 있고, 회원은 0개 이상의 게시글에 좋아요를 누를 수 있음
역참조 매니저 충돌
N : 1
유저가 작성한 게시글
user.article_set.all()
M : N
유저가 좋아요 한 게시글
user.article_set.all()
like_users 필드 생성 시 자동으로 역참조 메니저 .article_set가 생성됨
그러나 이전 N:1(Article-user)관계에서 이미 같은 이름의 매니저를 사용중
user가 작성한 글 (user.article_set)과 user가 좋아요 누른 글 (user.article_set)을 구분할 수 없게 됨
user와 관계된 Foreign Key 혹은 ManyToManyField 둘 중 하나에 related_name 작성 필요
User - Article 간 사용 가능한 전제 related manager
article.user
user.article_set
article.like_users
user.like_articles