Can't handle with Django Model related objects for Analysis-tracking App
I'm trying to make a web app that allows to add patients and add then track their medical analyses. Example Trying to make models for it... Could you advise me: what is the strategy if my next purpose is to make form that allows to fill in all lines from analysis group. Should I move in this way? (So next will be problems with orm queries)
I tried to deal with next solution but maybe u will take a professional look at this? Really appreciate
patient/models.py:
class PatientGender(models.Model):
gender = models.CharField(max_length=16)
def __str__(self):
return f"{self.gender}"
# Create your models here.
class Patient(models.Model):
hist_number = models.IntegerField(unique=True, verbose_name='Номер истории болезни')
last_name = models.CharField(max_length=32, verbose_name='Фамилия')
first_name = models.CharField(max_length=32, verbose_name='Имя')
second_name = models.CharField(max_length=32, verbose_name='Отчество')
birth_date = models.DateField(verbose_name='Дата рождения')
date_time = models.DateField(auto_now_add=True, verbose_name='Время поступления в ОРиТ')
sex = models.ForeignKey(PatientGender, verbose_name='Пол', on_delete=models.CASCADE, default=1)
seat = models.PositiveSmallIntegerField(verbose_name='Палата', blank=True, null=True)
description = models.TextField(blank=True, verbose_name='Палата')
is_Active = models.BooleanField(verbose_name='Находится на лечении', default=True)
def __str__(self):
return f"{self.hist_number}: {self.last_name} {self.first_name} {self.second_name}"
analysis/models.py:
class AnalyzesGroup(models.Model):
name = models.CharField(max_length=256, verbose_name='Группа исследований')
description = models.TextField(blank=True, verbose_name='Примечание')
class Meta:
verbose_name = 'Группа анализов'
verbose_name_plural = 'Группы анализов'
def __str__(self):
return f"{self.name}"
class AnalysisType(models.Model):
name = models.CharField(max_length=256, verbose_name='Исследование')
measurement = models.CharField(max_length=10, verbose_name='Единицы измерения')
ref_min = models.FloatField(verbose_name='Мин. реф. значения')
ref_max = models.FloatField(verbose_name='Макс. реф. значения')
description = models.TextField(blank=True, verbose_name='Примечание')
analyzes_group = models.ForeignKey(AnalyzesGroup, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Лабораторный показатель'
verbose_name_plural = 'Лабораторные показатели'
def __str__(self):
return f"{self.name}"
class PatientAnalysis(models.Model):
an_number = models.IntegerField(verbose_name='Номер анализа')
date = models.DateField(verbose_name='Дата анализа')
time = models.TimeField(verbose_name='Время')
patient = models.ForeignKey('patient.Patient', verbose_name='Анализ пациента', on_delete=models.CASCADE)
analysis = models.ForeignKey(AnalysisType, on_delete=models.CASCADE)
value = models.FloatField(verbose_name='Значение')
description = models.TextField(blank=True, verbose_name='Примечание')
class Meta:
verbose_name = 'Анализ'
verbose_name_plural = 'Анализы пациентов'
ordering = ['-date', '-time']
def __str__(self):
return f"{self.an_number} {self.patient} {self.analysis} {self.value} {self.analysis.measurement}"