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()

Вернуться на верх