Many to many relationships 1

이남경·2024년 4월 8일
0

SSAFY 11기

목록 보기
57/67

Many to many relationships


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


ManyToManyField()

M:N 관계 설정 모델 필드

만약 예약정보에 병의 증상, 예약일 등 추가 정보가 포함되어야 한다면?

Many to many field

실제 물리적 field를 생성하지는 않음 -> 환자 쪽에 필드 하나를 생성하지 않음

다대다 관계에서는 서로에게 종속되지 않음

어떤 매개체를 앞에 작성하느냐에 따라 관점이 바뀔 수 있음

환자 입장에서 의사를 조회

patient.doctors.all()

의사 입장에서 환자를 조회

doctor.patient_set.all()

'through' argument


'through' argument

중개 테이블에 '추가 데이터'를 사용해 M : N 관계를 형성하려는 경우에 사용

M : N 관계 주요 사항

M : N 관계로 맺어진 두 테이블에는 물리적인 변화가 없음

ManyToManyField는 중개 테이블을 자동으로 생성

ManyToManyField는 M : N 관계를 맺는 두 모델 어디에 위치해도 상관 없음

  • 대신 필드 작성 위치에 따라 참조와 역참조 방향을 주의할 것

N:1은 완전한 종속의 관계였지만, M : N은 종속된 관계가 아니며 '의사에게 진찰받는 환자 & 환자를 진찰하는 의사' 이렇게 2 가지 형태 모두 표현 가능

ManyToManyField


ManyToManyField(to, options)**

M : N 관계 설정 시 사용하는 모델 필드

ManyToManyField의 대표 인자 3가지

  1. related_name:

  2. through:

  3. 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.article_set.all() -> 해당 유저가 작성한 모든 게시글 조회

user가 작성한 글 (user.article_set)과 user가 좋아요 누른 글 (user.article_set)을 구분할 수 없게 됨

user와 관계된 Foreign Key 혹은 ManyToManyField 둘 중 하나에 related_name 작성 필요

User - Article 간 사용 가능한 전제 related manager

article.user

  • 게시글을 작성한 유저 N : 1

user.article_set

  • 유저가 작성한 게시글(역참조) N : 1

article.like_users

  • 게시글을 좋아요 한 유저 M : N

user.like_articles

  • 유저가 좋아요 한 게시글 (역참조 ) M : N

기능 구현


0개의 댓글

관련 채용 정보