Как отобразить в HTML только значения дикционария?

Я создал функцию, которая должна получить некоторую дату из базы данных, произвести некоторые вычисления и показать ее в HTML-файлах. Однако я не смог получить только значения из представлений.

def list_pay(request):
    item = Pay.objects.all()

    # Quantidades
    q_total = Pay.objects.all().count
    q_open = Pay.objects.filter(status=0).count
    q_paied = Pay.objects.filter(status=1).count

    # Soma dos valores
    v_total = Pay.objects.aggregate(Sum('value'))
    v_open = Pay.objects.filter(status=0).aggregate(Sum('value'))
    v_paied = Pay.objects.filter(status=1).aggregate(Sum('value'))


    data = {
        'item':item,
        'v_total':v_total,
        'v_open':v_open,
        'v_paied':v_paied,
        'q_total':q_total,
        'q_open':q_open,
        'q_paied':q_paied
        }
        
    return render(request, 'pay/list_pay.html', data)
<div class="row d-flex justify-content-center">
    <h3 class="mb-3 mt-3">Lista <span class="text-success">de pagamentos</span></h3>

    <div class="col m-3 p-3">
        <label>Total de boletos</label>
        <h1 class="text-primary"> {{ q_total }}</h1>
        <h1 class="text-primary"> {{ v_total }}</h1>
    </div>
    <div class="col m-3 p-3">
        <span>Quantidade de boletos</span>
        <h1 class="text-success">{{ q_paied }}</h1>
        <h1 class="text-success">{{ v_paied }}</h1>
    </div>
    <div class="col m-3 p-3">
        <span>Quantidade de boletos</span>
        <h1 class="text-danger">{{ q_open }}</h1>
        <h1 class="text-danger">{{ v_open }}</h1>
    </div>
</div>

Загружено текущее значение = {'value__sum': 1831}. Ожидаемый выход = 1831

Я уже пробовал использовать .values() и преобразовывать dict в список и другие форматы.

Выполните поиск, так:

<h1 class="text-success">{{ v_paied.value__sum }}</h1>

или вы можете выполнить поиск в представлении:

v_paied = Pay.objects.filter(status=1).aggregate(Sum('value'))['value__sum']

При этом в настоящее время вы выполняете несколько запросов, которые можно объединить в один SQL-запрос.

Действительно, мы можем использовать:

from django.db.models import Count, Q, Sum

def list_pay(request):
    data = Pay.objects.aggregate(
        q_total=Count('pk'),
        q_open=Count('pk', filter=Q(status=0)),
        q_paied=Count('pk', filter=Q(status=1)),
        v_total=Sum('value'),
        v_open=Sum('value', filter=Q(status=0)),
        v_paied=Sum('value', filter=Q(status=1)),
    )
    data['item'] = Pay.objects.all()
    return render(request, 'pay/list_pay.html', data)

Так что здесь мы делаем не более двух запросов к базе данных.

Вы должны быть в состоянии получить все это в одном агрегированном запросе, например

def list_pay(request):
    pay_items = Pay.objects.all()
    aggregate_data = pay_items.aggregate(
        q_open=Count("id", filter=Q(status=0)),
        q_paied=Count("id", filter=Q(status=1)),
        q_total=Count("id"),
        v_open=Sum("value", filter=Q(status=0)),
        v_paied=Sum("value", filter=Q(status=1)),
        v_total=Sum("value"),
    )

    data = {
        "item": pay_items,
        **aggregate_data,
    }

    return render(request, "pay/list_pay.html", data)
Вернуться на верх