将模型 objects 的数据转置为 django-datatables-view
Transpose data from model objects for django-datatables-view
我有以下(简化)格式的数据:
MetricData(models.Model) 具有以下字段:id、metric、date、facility、value
现在我想创建一个具有以下格式的 table(执行脚本以获得缩进输出 table):
<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>
如您所见,设施数量是动态的(新的可以添加到数据库中),列为 headers。对于每个设施,数据库中都会有度量数据。
我发现 django-datatables-view 中的所有示例基本上都是直接使用模型,并且一个模型条目被转换为一个 table 行。
您可以覆盖模型的 QuerySet
以获得 headers 的列表:
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>
我有以下(简化)格式的数据:
MetricData(models.Model) 具有以下字段:id、metric、date、facility、value
现在我想创建一个具有以下格式的 table(执行脚本以获得缩进输出 table):
<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>
如您所见,设施数量是动态的(新的可以添加到数据库中),列为 headers。对于每个设施,数据库中都会有度量数据。
我发现 django-datatables-view 中的所有示例基本上都是直接使用模型,并且一个模型条目被转换为一个 table 行。
您可以覆盖模型的 QuerySet
以获得 headers 的列表:
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>