Django:模板中的关系视图[多对一关系]

时间:2019-11-19 08:20:39

标签: django django-models orm jinja2 python-3.7

我的模型中存在多对一关系。我想在html table中查看与父表相关的子表的数据。这是我的models.py:

class DataCollection(models.Model):
    default_name = models.CharField(max_length=100)

class NameHistory(models.Model):
    old_name = models.CharField(max_length=100)
    collection_data = models.ForeignKey(DataCollection, on_delete=models.CASCADE, null=True)

这是我的views.py:

def dashboard(request):

foo = ( DataCollection.objects
                  .annotate(
                   first_old_name=Window(
                   expression=FirstValue('namehistory__old_name'),
                   partition_by=[F('id'), ],
                   order_by=F('namehistory__id').desc()
                   )
                  )
                 .values_list('first_old_name', flat=True)
                .distinct()
            )
context = {
    'sample': foo,
    'dashboard': DataCollection.objects.all(),
    'title':'Dashboard'
}

return render(request, 'dashboard/dashboard_form.html', context)

我的问题是,如何在与sample表的id相关的模板中查看此键DataCollection的数据。

这是我的模型中的示例数据,DataCollection

enter image description here

以下是NameHistory的示例数据:

enter image description here

因此在我的html table中应该是这样的:

enter image description here

我尝试了这种代码,但是我不知道为什么总是返回No Name

<tbody>
{% for data in dashboard %}
<tr>
    <td>{{ data.default_name }}</td>
    {% for item in sample.namehistory_set.all %}
        <td>{{ item.old_name }}</td>
    {% empty %}
        <td> No Name </td>
    {% endfor %}
</tr>
{% endfor %}
</tbody>

1 个答案:

答案 0 :(得分:2)

您应该为仪表板/表使用带注释的查询集,因为它将在每个对象上带有旧名称

foo = DataCollection.objects.annotate(
    first_old_name=Window(
        expression=FirstValue('namehistory__old_name'),
        partition_by=[F('id'), ],
        order_by=F('namehistory__id').desc()
    )
)
context = {
    'dashboard': foo,
    'title':'Dashboard'
}

然后在您的模板中

<tbody>
{% for data in dashboard %}
<tr>
    <td>{{ data.default_name }}</td>
    <td>{{ data.first_old_name:default"No Name" }}</td>
</tr>
{% endfor %}
</tbody>
相关问题