Суть задачи - необходимо вывести таблицу с итогами по категориям. Например:
Каждый пользователь выбирает свои категории. По каждой категории можно добавить несколько признаков. В пересечении пользователя и категории отображается количество признаков.
Для построения таблицы применяю SQL запрос и создаю переменную контекста.
sql = 'select pu.id, pu.user_id, '
for section in project.sections.all():
sql += ' (select COUNT(*) from section ...
sql += ' where pus.section_id = ' str(section.id)
sql += ' and pus.id = pusp.profile_user_section_id ) count_in_section_' + str(section.id) + ','
sql += ' u.first_name, u.last_name '
sql += ' from ...'
sql += ' where ... '
users_list = list(project.profile_users.raw(sql, params=[project_id]))
context = {'project': project,
'users_list': users_list,
}
return render(request, template, context)
Таким образом создаются колонки с итогами.
У меня вопрос, как обратиться в шаблоне к соответствующей колонке категории по ее названию сохраненному в переменной контекста, например:
column_name_1 ='item.count_in_section_' + str(section.id)...
{% for item in users_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.first_name }}</td>
<td>{{ item.last_name }}</td>
{% for section in project.sections.all %}
<td>
<b> {{ column_name_1 }}</b> <!-- ??? Нужна косвенная адресация -->
</td>
{% endfor %}
</tr>
{% endfor %}
...
Возможно это подход не имеет решения, но я надеюсь, что существует способ получения результата. Если есть идеи прошу поделиться с ними. Я нашел одно решение, без "косвенной адресации", но мне оно не нравится.
Дополняю вопрос моделями. Файл models.py:
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
# Create your models here.
class Section(models.Model):
name = models.CharField(max_length=25, verbose_name=_('Категория'))
class Criterion(models.Model):
name = models.CharField(max_length=250, verbose_name=_('Критерий'))
class ProfileUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name=_('Пользователь'), unique=True)
user_info = models.CharField(max_length=100)
class Project(models.Model):
profile_users = models.ManyToManyField(ProfileUser, verbose_name=_('Участники'), through='ProjectProfileUser')
class ProjectProfileUser(models.Model):
profile_user = models.ForeignKey(ProfileUser, on_delete=models.CASCADE, verbose_name=_('Пользователь'))
project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name=_('Проект'))
sections = models.ManyToManyField(Section, through='ProfileUserSection', verbose_name=_('Категории'))
class ProfileUserSection(models.Model):
project_profile_user = models.ForeignKey(ProjectProfileUser, on_delete=models.CASCADE, verbose_name=_('Пользователь'))
section = models.ForeignKey(Section, on_delete=models.CASCADE, verbose_name=_('Категория'))
сriterions = models.ManyToManyField(Criterion, verbose_name=_('Критерии'), through='ProfileUserSectionCriterion')
class ProfileUserSectionCriterion(models.Model):
criterion = models.OneToOneField(Criterion, on_delete=models.CASCADE, verbose_name=_('Критерий'))
profile_user_section = models.ForeignKey(ProfileUserSection, on_delete=models.CASCADE, verbose_name=_('Категория'))