Как фильтровать и упорядочивать по с помощью Sum, сохраняя суммированные данные в Django

OK... Я даже не знаю, как описать ситуацию в заголовке. Но рассмотрим следующие модели:

class TheModel(models.Model):
  qty = models.IntegerField()
  name = models.CharField()
  type = models.CharField(choices=['A' ,'B', 'C'])

Требуется получить сумму qty и отсортировать по сумме qty, но также иметь сумму A, B, C.

предположим, что всего имеется 5 строк:

name, qty, type
(name1, 3, A)
(name1, 3, B)
(name1, 4, C)
(name2, 5, A)
(name2, 10, C)

Результат должен быть следующим:

name  sum_qty, type A, type B, type C
name1    10      3       3       4
name2    15      5       0       10

В Django нет прямого решения для этой проблемы, но я попытался решить ее следующим образом

models.py

class TheModel(models.Model):
    ch=(('A','A'),('B','B'),('C','C'))
    name = models.CharField(max_length=255)
    qty = models.IntegerField()
    ch_type = models.CharField(max_length=255,choices=ch)

views.py

from django.shortcuts import render
from .models import *
from django.db.models import Sum


def HomeView(request):
    all_names ={i.name for i in TheModel.objects.all()}
    all_choices = {choice[0] for choice in TheModel.ch}
    output = []
    for name in all_names:
      typeA = TheModel.objects.filter(name=name, ch_type='A')
      typeB = TheModel.objects.filter(name=name, ch_type='B')
      typeC = TheModel.objects.filter(name=name, ch_type='C')
      data = {
        'name': name,
        'typeA': typeA.aggregate(Sum('qty'))['qty__sum'] if (len(typeA) > 0) else 0,
        'typeB': typeB.aggregate(Sum('qty'))['qty__sum'] if (len(typeB) > 0) else 0,
        'typeC': typeC.aggregate(Sum('qty'))['qty__sum'] if (len(typeC) > 0) else 0,    
      }
      data['sum'] = data['typeA'] + data['typeB'] + data['typeC']
      output.append(data)   

    context = {
      'all_data':sorted(output, key=lambda d: d['name'])
    }
    return render(request,'index.html',context)

Html

<div class="container">
  <div class="row">
    <div class="col-lg-12">
      <table class="table table-sm">
        <thead>
          <tr>
            <th scope="col">Name</th>
            <th scope="col">TypeA</th>
            <th scope="col">TypeB</th>
            <th scope="col">TypeC</th>
            <th scope="col">Sum</th>
          </tr>
        </thead>
        <tbody>

          {% for i in all_data %}
          <tr>
            <td>{{i.name}}</td>
            <td>{{i.typeA}}</td>
            <td>{{i.typeB}}</td>
            <td>{{i.typeC}}</td>
            <td>{{i.sum}}</td>
          </tr>
          {% endfor %}

        </tbody>
      </table>
    </div>
  </div>
</div>

Вывод в Html-таблицу

enter image description here

вывод панели администратора

enter image description here

Вернуться на верх