Как отобразить в 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)