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):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
name = models.TextField()
def __str__(self):
return f'{self.pk}번 환자 {self.name}'
In [1]: doctor1 = Doctor.objects.create(name='allie')
In [2]: doctor2 = Doctor.objects.create(name='barbie')
In [3]: patient1 = Patient.objects.create(name='carol', doctor=doctor1)
In [4]: patient2 = Patient.objects.create(name='duke', doctor=doctor2)
In [5]: doctor1
Out[5]: <Doctor: 1번 의사 allie>
In [6]: doctor2
Out[6]: <Doctor: 2번 의사 barbie>
In [7]: patient1
Out[7]: <Patient: 1번 환자 carol>
In [8]: patient2
Out[8]: <Patient: 2번 환자 duke>
1번 환자(carol)가 두 의사에게 모두 진료를 받고자 한다면 환자 테이블에 1번 환자 데이터가 중복으로 입력될 수 밖에 없음
hospitals_doctor
| id | name |
|---|---|
| 1 | allie |
| 2 | barbie |
hospitals_patients
| id | name | doctor_id |
|---|---|---|
| 1 | carol | 1 |
| 2 | duke | 2 |
| 3 | carol | 2 |
예약 테이블을 따로 만들어야함
예약 모델 생성
| id | doctor_id | patient_id |
|---|---|---|
| . | . | . |
예약 데이터 생성
doctor1 = Doctor.objects.create(name='allie')
patient1 = Patient.objects.create(name='carol')
Reservation.objects.create(doctor = doctor1, patient = patient1)
의사 -> 예약 정보 찾기
doctor1.reservation_set.all()
<QuerySet [<Reservation: 1번 의사의 1번 환자>]>
환자 -> 예약 정보 찾기
patient1.reservation_set.all()
<QuerySet [<Reservation: 1번 의사의 1번 환자>]>
patient2 = Patient.objects.create(name='duke')
Reservation.objects.create(doctor=doctor1, patient=patient2)
#의사 -> 환자 목록 doctor1.reservation_set.all() <Queryset [<Reservation: 1번 의사의 1번 환자>, <Reservation: 1번 의사의 2번 환자>]>
#hospitals/models.py
class Patient(models.Modle):
# ManyToManyField 작성
doctors = models.ManyToManyField(Doctor)
name = models.TextField()
def __str__(self):
return f'{self.pk}번 환자 {self.name}'
class Patient(models.Model):
doctors = models.ManyToManyField(Doctor, through='Reservation')
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)
symptom = models.TextField()
reserved_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.doctor.pk}번 의사의 {self.patient.pk}번 환자'
patient2.doctors.add(doctor1, through_defaults={'symptom': 'flu'})
한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우
양 쪽에서 모두 N:1 관계를 가짐
Article(M) - User(N)
게시글은 회원으로부터 0개 이상의 좋아요를 받을 수 있고, 회원은 0개 이상의 게시글에 좋아요를 누를 수 있음
#articles/models.py
class Article(modles.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
like_users = models.ManyToManyField(settings.AUTH_USER_MODEL)
user와 관계된 ForeignKey 혹은 ManyToManyField 둘 중 하나에 related_name 작성 필요
like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_articles')