Транспонировать данные из объектов модели для django-datatables-view - PullRequest
2 голосов
/ 06 октября 2019

У меня есть данные в следующем (упрощенном) формате:

MetricData (models.Model) со следующими полями: идентификатор, метрика, дата, объект, значение

Теперь я хочу создатьтаблица в следующем формате (выполните скрипт для получения таблицы с отступом):

 <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, которые я нахожу, в основном используют модели напрямую, и одна запись модели преобразуется в одну строку таблицы.

1 Ответ

1 голос
/ 06 октября 2019

Вы можете переопределить QuerySet для вашей модели, чтобы получить список заголовков:

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()

Обратите внимание, что я добавил header_column вместо жесткого кодирования facility в QuerySet. Это позволяет вам повторно использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...