Database M:N関係Intro
M:N関係
INTRO:病院カルテシステムを用いて多対多関係を知る
練習モード
#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)
hospital_doctoridname1justin2eric
hospitals_patient
idnamedoctor_id1tony12harry23tony2
patient3 = Patient.objects.create(name='tony', doctor=doctor2)
1:N制限
1番患者(トニー)が1番医師の診療を終え、2番医師に会いに行きたい場合は、新たな予約が必要です.
patient4 = Patient.objects.create(name='harry', doctor=doctor1, doctor2)
仲介モード
iddoctor_idpatient_id...
移行中のファイルと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번
환자>]>
1人の医者は複数の患者を診療することができ、1人の患者は複数の医者を診療することができ、1つの関係を形成した.ManyToManyField
ManyToManyField ?
多対多の関係を作成するためのモデルフィールド
必要な位置パラメータ(M:N関係に設定するモデルクラス)が必要です.
ManyToManyFiledの作成(ブローカモデルの削除)
ManyToManyFiledの適用
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 []>
related_name
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()
Djangoでの仲介モデル
サマリ
Reference
この問題について(Database M:N関係Intro), 我々は、より多くの情報をここで見つけました https://velog.io/@holawan/DatabaseMN관계-Introテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol