将模型 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>