Шаблон Django отображает аннотированные данные вместе с данными модели в пользовательском интерфейсе для объектов отношений "многие ко многим
Я ищу решение для отображения элементов данных модели вместе с аннотированными данными, например, у меня есть модель TestRun, которая имеет M2M отношения с TestCases, поэтому на странице UI для списка testruns хочу показать данные TsetRun вместе с количеством testcases, сгруппированных по их статусу.
e.g. TestRun.ID = 1, TestRun.Name = Regression
Total TCs in TR = 4
Passed TC = 2 | Blocked TC = 1 | Failed TC = 1
вместе с таблицей для каждой записи выполнения, чтобы показать вышеупомянутые 4 тестовых случая, например
TC_ID|TC_NAME|TC_STATUS|
1 |TC_101 | Passed |
4 |TC_102 | Passed |
5 |TC_105 | Failed |
7 |TC_107 | Blocked |
У меня есть следующие модели
class TestRun(models.Model):
testcases = models.ManyToManyField(TestCase, through="TestRunCases")
project = models.ForeignKey(Project, related_name="project_testruns", on_delete=models.PROTECT)
name = models.CharField(max_length=255)
class TestRunCases(models.Model):
testcases = models.ForeignKey(TestCase, on_delete=models.CASCADE)
testrun = models.ForeignKey(TestRun, on_delete=models.CASCADE)
testcase_status = models.ForeignKey(TestCaseStatus, null=True, default=1, on_delete=models.PROTECT)
Я хочу показать количество тестовых случаев для каждого прогона со статусом, например. Для TestRun.id=1, Total TC#=3, Passed=2, Failed=1, шаблон, например, представлен ниже
Я попробовал использовать следующее в моих представлениях, используя CBV
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["testcases"] = (
TestRunCases.objects.filter(testrun_id__in=testrun_qs)
.values("testrun_id", "testcase_status__status_value")
.annotate(status_count=Count("id"))
)
return context
А в моем шаблоне
{% for testrun in object_list %}
<div>
{{ testrun.id }}-{{ testrun.name }}
<div>
{{ testrun.testcases.all.count }} Test Case{{ testrun.testcases.all.count|pluralize }}
{% regroup testcases by testrun_id as tc_by_run %}
{% for testrun_id in tc_by_run %}
{% if testrun_id.grouper == testrun.id %}
{% for tc_count_by_sts in testrun_id.list %}
{{ tc_count_by_sts.status_count }} {{ tc_count_by_sts.testcase_status__status_value }}
{% endfor %}
{% endif %}
{% endfor %}
</div>
<table>
<thead>
<tr>
<th>Test Case Name</th>
<th>Test Case Status</th>
</tr>
</thead>
<tbody>
{% for tr_item in testrun.testruncases_set.all %}
<tr>
<td>{{ tr_item.testcases.tcname }}</td>
<td>{{ tr_item.testcase_status.status_value }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endfor %}
Is this the recommended way or this can be implemented using another approach.