#models.py
class Doctor(models.Model):
name = models.TextField()
def __str__(self):
return f'{self.pk}번 의사 {self.name}'
class Patient(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
name = models.TextField()
def __str__(self):
return f'{self.pk}번 환자 {self.name}'
doctor1 = Doctor.objects.create(name='justin')
doctor2 = Doctor.objects.create(name='eric')
patient1 = Patient.objects.create(name='tony', doctor=doctor1)
patient2 = Patient.objects.create(name='harry', doctor=doctor2)
id | name |
---|---|
1 | justin |
2 | eric |
id | name | doctor_id |
---|---|---|
1 | tony | 1 |
2 | harry | 2 |
3 | tony | 2 |
patient3 = Patient.objects.create(name='tony', doctor=doctor2)
patient4 = Patient.objects.create(name='harry', doctor=doctor1, doctor2)
id | doctor_id | patient_id |
---|---|---|
. | . | . |
기존 마이그레이션 초기화를 위해 migration 내 파일과 db지우기
새로운 모델 적용
from django.db import models
class Doctor(models.Model):
name = models.TextField()
def __str__(self):
return f'{self.pk}번 의사 {self.name}'
# 외래키 삭제
class Patient(models.Model):
name = models.TextField()
def __str__(self):
return f'{self.pk}번 환자 {self.name}'
# 중개모델 작성
class Reservation(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
def __str__(self):
return f'{self.doctor_id}번 의사의 {self.patient_id}번 환자'
In [1]: doctor1 = Doctor.objects.create(name='justin')
In [2]: patient1 = Patient.objects.create(name='tony')
In [3]: Reservation.objects.create(doctor=doctor1, patient=patient1)
Out[3]: <Reservation: 1번 의사의 1번 환자>
#의사의 예약환자 조회
In [4]: doctor1.reservation_set.all()
Out[4]: <QuerySet [<Reservation: 1번 의사의 1번 환자>]>
#환자의 진료의사 조회
In [5]: patient1.reservation_set.all()
Out[5]: <QuerySet [<Reservation: 1번 의사의 1번 환자>]>
In [7]: Reservation.objects.create(doctor=doctor1, patient=patient2)
Out[7]: <Reservation: 1번 의사의 2번 환자>
In [9]: doctor1.reservation_set.all()
Out[9]: <QuerySet [<Reservation: 1번 의사의 1번 환자>, <Reservation: 1번 의사의 2번
환자>]>
ManyToManyField ?
다대다 관계 설정 시 사용하는 모델 필드
하나의 필수 위치인자(M:N 관계로 설정할 모델 클래스)가 필요
ManyToManyField 작성 (중개모델 삭제)
ManyToManyField 적용
class Doctor(models.Model):
name = models.TextField()
def __str__(self):
return f'{self.pk}번 의사 {self.name}'
class Patient(models.Model):
# ManyToManyField 작성
doctors = models.ManyToManyField(Doctor)
name = models.TextField()
def __str__(self):
return f'{self.pk}번 환자 {self.name}'
중개모델과 같은 테이블이 생성됨
의사 1명과 환자 2명 생성
doctor1 = Doctor.objects.create(name='justin')
patient1 = Patient.objects.create(name='tony')
patient2 = Patient.objects.create(name='harry')
#환자1이 의사1에게 예약 진행
patient1.doctors.add(doctor1)
#patient1이 예약한 의사 목록 확인
patient1.doctors.all()
Out[6]: <QuerySet [<Doctor: 1번 의사 justin>]>
#doctor1에게 예약된 환자 목록 확인
doctor1.patient_set.all()
Out[7]: <QuerySet [<Patient: 1번 환자 tony>]>
#의사 1에게 환자2 추가
doctor1.patient_set.add(patient2)
#의사가 맡은 환자들조회
doctor1.patient_set.all()
Out[9]: <QuerySet [<Patient: 1번 환자 tony>, <Patient: 2번 환자 harry>]>
patient2.doctors.all()
Out[10]: <QuerySet [<Doctor: 1번 의사 justin>]>
patient1.doctors.all()
Out[11]: <QuerySet [<Doctor: 1번 의사 justin>]>
#1번 환자 삭제
doctor1.patient_set.remove(patient1)
#2번 환자만 남음
doctor1.patient_set.all()
Out[13]: <QuerySet [<Patient: 2번 환자 harry>]>
#1번 환자의 예약정보는 사라짐
patient1.doctors.all()
Out[14]: <QuerySet []>
#2번 환자의 예약 중 1번 의사 삭제
patient2.doctors.remove(doctor1)
#2번 환자의 예약정보 사라짐
patient2.doctors.all()
Out[19]: <QuerySet []>
#1번 의사의 예약 정보 사라짐
doctor1.patient_set.all()
Out[20]: <QuerySet []>
from django.db import models
class Doctor(models.Model):
name = models.TextField()
def __str__(self):
return f'{self.pk}번 의사 {self.name}'
class Patient(models.Model):
# ManyToManyField - related_name 작성
doctors = models.ManyToManyField(Doctor, related_name='patients')
name = models.TextField()
def __str__(self):
return f'{self.pk}번 환자 {self.name}'
#환자 1의 모든 예약 조회
patient1.doctors.all()
#의사 1의 모든 예약 조회
doctor1.patients.all()