OnetoOneField Django查询

时间:2016-12-22 16:11:20

标签: python django templates one-to-one

所以我有这两个模型:

class Patient(models.Model):
    patientID = models.CharField(max_length=200 , default='Enter PatientID')
    age = models.IntegerField(default='-')
    gender = models.CharField(max_length=200,choices=Gender_Choice, default='UNDEFINED')

class RiskFactor(models.Model):
    patient = models.OneToOneField(Patient, on_delete=models.CASCADE)
    hypertension = models.BooleanField(default=False)
    diabetes = models.BooleanField(default=False)
    PAVK = models.BooleanField(default=False)
    nicotin = models.BooleanField(default=False)

因为原因,我已经从ForeignKey更改为OnetoOneField。因此,使用ForeignKey,一切都很容易,我可以在我的患者详细信息模板中显示RiskFactor模型的数据。现在我有问题需要更改查询。我只是不知道如何改变这个:

<ul>
  {% for rfac in patient.riskfactor_set.all %}
   <li>Hypertension: {{ rfac.hypertension }}<br/>
      Diabetes: {{ rfac.diabetes }}<br/>
      PAVK: {{ rfac.PAVK }}<br/>
      Nicotin: {{ rfac.nicotin }}<br/>
   </li>
   {% endfor %}
</ul>

显示患有OneToOneRel的患者的风险因素数据。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我会将related_name="risk_factor"添加到您的OneToOneField声明中,只是为了更清楚地说明如何引用相关的RiskFactor。从那里,您可以像patient的任何其他属性一样引用它 - 它不再是列表,而是单个对象。如下所示

<ul>
  {% with patient.risk_factor as rfac %}
    <li>Hypertension: {{ rfac.hypertension }}<br/>
      Diabetes: {{ rfac.diabetes }}<br/>
      PAVK: {{ rfac.PAVK }}<br/>
      Nicotin: {{ rfac.nicotin }}<br/>
    </li>
  {% endwidth %}
</ul>

你可以不使用with语句,但它最容易转换你的代码,然后你必须在你想要的每个属性之前放置patient.risk_factor.,所以不妨将它保存到rfac

答案 1 :(得分:0)

您试图查询一组一对一的关系,这是不可能的。因为每个患者只能有1个RiskFactor。

为什么不根据患者获得风险因素并将其传递到模板中,如下所示:

patient_risk = RiskFactor.objects.get(patient=patient)

ctx = {
    'rfac': patient_risk
}

然后在您的模板中,您可以获得特定患者的风险。

<ul>
   <li>Hypertension: {{ rfac.hypertension }}<br/>
      Diabetes: {{ rfac.diabetes }}<br/>
      PAVK: {{ rfac.PAVK }}<br/>
      Nicotin: {{ rfac.nicotin }}<br/>
   </li>
</ul>

如果您希望循环所有拥有RiskFactors的患者,您还可以查询所有RiskFactors模型并通过RiskFactor.patient访问患者。

all_risk_factors = RiskFactor.objects.all()

ctx = {
    'risk_factors': all_risk_factors
}

<ul>
  {% for risk in risk_factors %}
   <li><strong>Patient ID: risk.patient.patientID</strong></li>
   <li>Hypertension: {{ risk.hypertension }}<br/>
      Diabetes: {{ risk.diabetes }}<br/>
      PAVK: {{ risk.PAVK }}<br/>
      Nicotin: {{ risk.nicotin }}<br/>
   </li>
   {% endfor %}
</ul>