Skip to main content
 首页 » 编程设计

python之为 django-datatables-view 转置来自模型对象的数据

2024年11月01日23dflying

我有以下(简化)格式的数据:

具有以下字段的 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>