我有以下(简化)格式的数据:
具有以下字段的 MetricData(models.Model):id、metric、date、facility、value
现在我想创建一个具有以下格式的表(执行脚本以获取缩进输出表):
<table style="width:100%">
<tr>
<th>Date</th>
<th>Facility 1</th>
<th>Facility 2</th>
<th>Facility 3</th>
</tr>
<tr>
<td>03/2019</td>
<td>1.0</td>
<td>1.5</td>
<td>2.5</td>
</tr>
<tr>
<td>04/2019</td>
<td>1.5</td>
<td>1.5</td>
<td>2.0</td>
</tr>
</table>
如您所见,动态的设施数量(可以将新设施添加到数据库)是列标题。对于每个设施,数据库中都会有度量数据。
我找到的所有django-datatables-view的例子基本上都是直接使用模型,一个模型条目被转换为一个表行。
请您参考如下方法:
您可以覆盖模型的 QuerySet 以获取 header 列表:
class MetricDataQuerySet(models.QuerySet):
@property
def headers(self):
return [getattr(instance, self.model.header_column) for instance in self]
class MetricData(models.Model):
header_column = 'facility'
...
objects = MetricDataQuerySet.as_manager()
请注意,我在 QuerySet 中添加了 header_column,而不是硬编码 facility。这允许您在最终需要时为不同的模型重用 QuerySet。
现在,在你看来:
def some_view(request):
...
context = {
'objects': MetricData.objects.all()
}
return render(request, 'some_template.html', context)
最后,在 some_template.html 上,您可以这样做:
<table>
<tr>
{% for header in objects.headers %}
<th>{{ header }}</th>
{% endfor %}
</tr>
{% for object in objects %}
<tr>
<td>row.date</td>
<td>row.metric</td>
<td>row.value</td>
</tr>
{% endfor %}
</table>
