DM M:N(Patient-User)

Luca·2023년 4월 11일
0

DB

목록 보기
1/3
post-thumbnail

M:N

  • 한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우
  • 병원의 내원하는 환자와 의사의 예약 시스템을 구축해본다면?

N:1로 구현하고자 한다면?

  • 1명의 환자가 2명 이상의 의사에게 방문하려고 한다면
  • '같은 환자의 id가 다른 값으로 배정된다'는 문제가 발생

ManyToManyField(to, **options)

  • 다대다(M:N) 관계 설정시 사용하는 모델 필드
  • 중개모델을 직접 작성하지 않고 편리하게 작성 가능
  1. related_name
    • target model이 source model을 참조할 때 사용할 manager name
  2. through
    • 중개 테이블을 직접 작성하는 경우 해당 옵션을 사용하여 Django 모델 지정
    • 일반적으로 중개 테이블에 추가 데이터를 사용할 때 사용
  3. symmetrical
    • 기본값: True -> False
    • _set 매니저를 추가하지 않음
    • 대칭 구조 ex) 싸이월드 - 일촌 관계

의사와 환자간 예약 시크템 구축

  1. 새로운 project 생성 후 hospitals app 생성
    • settings에 app이름과 django_extentions 추가
  2. hospitals의 model에 Doctor, Patient 클래스 생성
    • DB 정규화를 지키기 위해 M:N 관계 설정
    • 모델의 변경사항시 makemigrations와 migrate 진행
  3. shell_plus로 객체 생성
    1. 의사1 생성
    2. doctor1 = Doctor.objects.create(name='KANGMIN')
    3. 환자1 생성
    4. patient1 = Patient.objects.create(name='LISA')
    5. 예약 생성
    6. Reservation.objects.create(doctor=doctor1, patient=patient1)
  4. 환자 모델에 ManyToManyField 사용
  5. shell_plus로 객체 생성
  6. though 옵션을 사용해서 모델 지정
    • DB의 이름도 바뀌는 것을 확인할 수 있다.

Like(좋아요) 구현하기

  1. ManyToManyField 작성
    • 모델을 변경하고 makemigrations을 진행하면 오류가 발생
    • like_user 필드 생성 시 자동으로 역참조에는 .article_set 매니저가 생성됨 하지만 이전에 N:1(Article-User) 관계에서 이미 해당 매니저 사용중 user.article_set.all() -> 해당 유저가 작성한 모든 게시글 조회 중복을 피하기 위해서 ForeignKey나 ManyToManyField 중 하나에 related_name 사용
  2. urls 작성
  3. views 작성
    • from django.contrib.auth.decorators import login_required
    • from crud import settings
  4. index에 좋아요가 나오게 수정

0개의 댓글