Django: Как получить значение в одной модели из другой модели?
Кажется, что это очень простой вопрос, но как получить значение в одной модели из другой в django?
У меня models.py
вот так:
class Patient(models.Model):
id = models.AutoField(primary_key=True, verbose_name='Patient ID')
class Salvage_Treatment(models.Model):
id = models.AutoField(primary_key=True)
id_patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
Salvage_treatment_end_date = models.DateField()
class Survival_Parameters(models.Model):
id = models.AutoField(primary_key=True)
salv_treat = models.ForeignKey(Salvage_Treatment, on_delete=models.CASCADE)
salvage_treatment_end_date = models.DateField()
id_patient = models.ForeignKey('Patient', on_delete=models.CASCADE)
Допустим, у меня есть пациент с id_patient = 2
, и я заполнил для него форму Salvage_Treatment
с id=1
(id этой формы) и некоторой датой в Salvage_treatment_end_date
. Теперь мне нужно, чтобы эта же дата автоматически помещалась в Survival_Parameters.salvage_treatment_end_date
. Как я могу это сделать? Я не хочу выбирать, из какой формы Salvage_Treatment
получать данные - вместо этого я ТОЛЬКО хочу выбрать ID пациента.
Не уверен, какой из следующих трех запросов вы запрашиваете
salvage_treatment_end_date = Salvage_Treatment.objects.filter(id_patient=patient_id_you_have).values(‘Salvage_treatment_end_date’)
salvage_treatment_end_date = Survival_Parameters.objects.filter(id_patient=patient_id_you_have).values(‘salvage_treatment_end_date’)
salvage_treatment_end_date = Survival_Parameters.objects.filter(salv_treat__id_patient=patient_id_you_have).values(‘salvage_treatment_end_date’)
Метод .filter ограничивает набор запросов идентификатором пациента, который у вас есть, а метод .values ограничивает вывод одним полем.
Обратите внимание на двойное _ после salv_treat в третьем запросе, это способ django ссылаться на реляционное поле.
Я не могу не согласиться с @nigel222, даже если вы используете id_patient вместо patient_id. Когда вы обращаетесь к salvage_treatment.patient_id и он фактически возвращает экземпляр Patient, это сильно ухудшает читабельность.
так как я предполагаю, что вы не хотите устанавливать значение по умолчанию текущей даты salvage_treatment_end_date
для Survival_Parameters
default=datetime.now
но в вашем случае вы можете переписать save()
метод Survival_Parameters
и здесь вы можете сохранить дату Salvage_treatment_end_date
в salvage_treatment_end_date
вот так
class Patient(models.Model):
id = models.AutoField(primary_key=True, verbose_name='Patient ID')
class Salvage_Treatment(models.Model):
id = models.AutoField(primary_key=True)
id_patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
Salvage_treatment_end_date = models.DateField()
class Survival_Parameters(models.Model):
id = models.AutoField(primary_key=True)
salv_treat = models.ForeignKey(Salvage_Treatment,
on_delete=models.CASCADE)
salvage_treatment_end_date = models.DateField()
id_patient = models.ForeignKey('Patient', on_delete=models.CASCADE)
def save(self, **kwargs):
self.salvage_treatment_end_date =
self.salv_treat.Salvage_treatment_end_date
super().save(**kwargs)
из-за связи (один ко многим) между этими двумя таблицами вы можете получить доступ к Salvage_Treatment
с помощью self.salv_treat
, а также получить доступ к Salvage_treatment_end_date
с помощью self.salv_treat.Salvage_treatment_end_date
.
в конце концов, вы вызываете метод super
класса save()