Django:记录分组

时间:2018-02-04 04:33:58

标签: python django

如果问题标题不正确,请道歉。如果这里的细节让您了解我的要求,请有人纠正。我不是说英语的人,所以在写标题时可能会犯错误。

我有这个型号:

class ClinicDoctor(models.Model):
    doctor = models.ForeignKey('User', related_name='doctorsF') # single quotes (') because User table is defined down the code.
    clinic = models.ForeignKey(Clinic, related_name='clinicsF')

我正在尝试取出所有医生记录和他们的诊所。有些医生可能有多个诊所。在我的模板中,我循环遍历以下查询集:

doctorsQuerySet = ClinicDoctor.objects.filter(doctor__groups__name='Doctor')

这会返回记录,但我想在这样的表中显示记录:

DoctorHeader ------------- ClinicsHeader
医生1 ----------------诊所1,诊所2.
医生2 ----------------诊所3
医生3 ----------------诊所4,诊所5,诊所7

我的想法是,我只想向每位医生展示一次,然后将他所有相关的诊所放在该医生的那一行。

现在我正在循环模板中的查询集,但是会多次显示相同的医生记录(与相关诊所一样多)。

有没有什么方法可以修改上面的查询以实现分组,或者我将不得不在模板中处理它以查看Doctor_id何时从之前的循环运行中更改并连接诊所然后将它们放入{{ 1}}标签?

我试图搜索SO,但没有找到相关问题。可能是我的措辞,而搜索与我正在寻找的不一样。如果它已经解决了某人,那么道歉。您可以分享链接。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您只需要模板中的数据,则可以使用以下内容(请注意,下面的代码实际上没有经过测试,但希望能让您朝着正确的方向前进):

views.py

...
# Pass whatever model is the foreign key for "doctor" in the ClinicDoctor model
context = {"doctors": User.objects.all()}
...

template.html

<table>
  <thead>
    <tr>
      <th>Doctor Header</th>
      <th>Clinics Header</th>
    </tr>
  </thead>
  <tbody>
    {% for doctor in doctors %}
      <tr>
        <td>{{ doctor }}</td>
        <td>
          {% for clinicdoctor in doctor.clinicdoctor_set.all %}
            clinicdoctor.clinic{% if not forloop.last %}, {% endif %}
          {% endfor %}
        </td>
      </tr>
    {% endfor %}
  </tbody>
</table>

首先将您的医生查询集传递给模板,然后循环遍历它们。 clinicdoctor_set.all将检索该医生的所有ClinicDoctor条目(_set.all允许您反向检索外键关系中的所有条目)。然后,您可以正常引用相关的诊所外键。

{% if not forloop.last %}, {% endif %}将在每个诊所条目之间添加逗号,但循环的最后一个除外。

您可以在Related objects referenceTemplate reference下了解更多信息。