M:N
- 한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우
- 병원의 내원하는 환자와 의사의 예약 시스템을 구축해본다면?
N:1로 구현하고자 한다면?
- 1명의 환자가 2명 이상의 의사에게 방문하려고 한다면
- '같은 환자의 id가 다른 값으로 배정된다'는 문제가 발생
![]()
ManyToManyField(to, **options)
- 다대다(M:N) 관계 설정시 사용하는 모델 필드
- 중개모델을 직접 작성하지 않고 편리하게 작성 가능
- related_name
- target model이 source model을 참조할 때 사용할 manager name
- through
- 중개 테이블을 직접 작성하는 경우 해당 옵션을 사용하여 Django 모델 지정
- 일반적으로 중개 테이블에 추가 데이터를 사용할 때 사용
- symmetrical
- 기본값: True -> False
- _set 매니저를 추가하지 않음
- 대칭 구조 ex) 싸이월드 - 일촌 관계
의사와 환자간 예약 시크템 구축
- 새로운 project 생성 후 hospitals app 생성
- settings에 app이름과 django_extentions 추가
- hospitals의 model에 Doctor, Patient 클래스 생성
- DB 정규화를 지키기 위해 M:N 관계 설정
- 모델의 변경사항시 makemigrations와 migrate 진행
![]()
- shell_plus로 객체 생성
- 의사1 생성
doctor1 = Doctor.objects.create(name='KANGMIN')- 환자1 생성
patient1 = Patient.objects.create(name='LISA')- 예약 생성
Reservation.objects.create(doctor=doctor1, patient=patient1)- 환자 모델에 ManyToManyField 사용
![]()
- shell_plus로 객체 생성
![]()
- though 옵션을 사용해서 모델 지정
- DB의 이름도 바뀌는 것을 확인할 수 있다.
![]()
Like(좋아요) 구현하기
- ManyToManyField 작성
- 모델을 변경하고 makemigrations을 진행하면 오류가 발생
like_user 필드 생성 시 자동으로 역참조에는 .article_set 매니저가 생성됨 하지만 이전에 N:1(Article-User) 관계에서 이미 해당 매니저 사용중 user.article_set.all() -> 해당 유저가 작성한 모든 게시글 조회 중복을 피하기 위해서 ForeignKey나 ManyToManyField 중 하나에 related_name 사용- urls 작성
![]()
- views 작성
- from django.contrib.auth.decorators import login_required
- from crud import settings
![]()
- index에 좋아요가 나오게 수정
![]()