Эффективное создание объекта из данных, введенных пользователем, в django
Я создаю веб-приложение, в котором пользователи будут вводить некоторые данные о пациенте, а алгоритм будет обрабатывать их и генерировать рекомендации по лечению. Мой вопрос заключается в том, как наилучшим образом спроектировать мои модели и как алгоритму получить доступ к введенным пользователем данным.
Вот мои текущие модели для сбора данных, вводимых пользователем. Модели Diagnosis, Problem, CurrentMed и PastMed имеют гибкое количество записей (пользователь может динамически добавлять строки в форму ввода), поэтому у меня нет ни одной более крупной модели Patient:
models.py
class Patient(TimeStampedModel):
# get a unique id for each patient
patient_id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
name = models.CharField("Patient Name", max_length=255)
age = models.IntegerField("Age", default=0)
class Sex(models.TextChoices):
MALE = "male", "Male"
FEMALE = "female", "Female"
UNSPECIFIED = "unspecified", "Unspecified"
sex = models.CharField(
"Sex", max_length=20,
choices=Sex.choices, default=Sex.UNSPECIFIED)
creator = models.ForeignKey(
settings.AUTH_USER_MODEL,
null=True,
on_delete=models.SET_NULL)
class Diagnosis(TimeStampedModel):
DIAG_CHOICES = [
(‘cancer’, ‘Cancer’),
(‘influenza’, ‘Influenza’),
('unspecified', 'Unspecified'),]
diag_name = models.CharField(
"diag", max_length=200,
choices=DIAG_CHOICES, default="unspecified")
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
class Problem(TimeStampedModel):
PROB_CHOICES = [
(‘pain’, ‘Pain’),
(‘wheeze’, ‘Wheeze’),
('unspecified', 'Unspecified'),]
prob_name = models.CharField(
"prob", max_length=200,
choices=PROB_CHOICES, default="unspecified")
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
class Med(TimeStampedModel):
MED_CHOICES = [
(‘Antibiotics’, (
(‘penicillin’, ‘Penicillin’),
(‘amoxicillin’, ‘Amoxicillin’),
)
),
(‘Painkillers’, (
(‘paracetamol’, ‘Paracetamol’),
(‘ibuprofen’, ‘Ibuprofen’),
)
),
('unspecified', 'Unspecified'),]
med_name = models.CharField(
"", max_length=20,
choices=MED_CHOICES, default='unspecified')
dose = models.IntegerField("Dose (mg)", default=0)
# Is this a medication currently being taken or one taken in the past
timepoint = models.CharField(
"timepoint", max_length=20,
choices=[('current','current'), ('past', 'past')], default='unspecified')
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
class Meta:
abstract = True
class CurrentMed(Med):
timepoint = models.CharField(
"", max_length=20,
choices=[('current','current'), ('past', 'past')], default='current')
class PastMed(Med):
timepoint = models.CharField(
"", max_length=20,
choices=[('current','current'), ('past', 'past')], default='past')
Я думаю, что в качестве входных данных для алгоритма выбора лечения было бы полезно собрать введенные пользователем данные в новый объект, имеющий вид, подобный следующему:
new_object.py
drug_info = pd.read_csv('../data/drug_data/drug_info.csv')
class Patient2:
def __init__(self, age, sex, meds, diagnosis, problems):
self.age = age
self.sex = sex
self.meds = meds
self.diagnosis = diagnosis
self.problems = problems
class Meds2:
def __init__(self, current, past):
self.current = process_meds(current)
self.past = process_meds(past)
class Diagnosis2:
def __init__(self, problems):
self.diagnosis = diagnosis
class Problem2:
def __init__(self, problems):
self.problems = problems
def is_therapeutic_dose(drug_info, drug, dose):
"""check if prescribed dose of drug is above minimum therapeutic dose"""
cutoff = drug_info[drug_info['drug'] == drug]['dose'].values[0]
return dose >= cutoff
def process_meds(med_df):
"""calculate whether dose of each drug above minimum therapeutic dose,
and assign pharmacological class"""
therapeutic = []
classes = []
for drug in med_df['drug']:
dose = med_df[med_df['drug'] == drug]['dose'].values[0]
therapeutic.append(is_therapeutic_dose(drug_info, drug, dose))
classes.append(drug_info[drug_info['drug'] == drug]['class1'].values[0])
med_df['therapeutic'] = therapeutic
med_df['class'] = classes
return med_df
Проводить такую сборку, однако, кажется, что это будет довольно долго и потенциально неэффективно
reassembly.py
from django.db.utils import DEFAULT_DB_ALIAS
from django.contrib.admin.utils import NestedObjects
collector = NestedObjects(using=DEFAULT_DB_ALIAS)
queryset = Patient.objects.filter(patient_id='aa8e836d-f5dd-44cf-ba54-1bdc8b5e1445')
collector.collect(queryset)
patient_object_for_treatment_algo = Patient2=(list(collector.data[Patient])[0].age,
list(collector.data[Patient])[0].sex,
processing_func(list(collector.data[CurrentMed])),
processing_func2(list(collector.data[Diagnosis]))
)
Мне кажется, что я потенциально усложняю подход, и я хотел бы узнать, есть ли более очевидный и эффективный способ сделать это?