Django: нельзя группировать по шаблонной таблице - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь показать таблицу в шаблоне, которая показывает транзакции с их датами.

Запрос:

resultado = Asiento.objects.filter(
    Empresa=request.session['codEmp'],
    codcta=cod_cta
).exclude(anulado='S').order_by(date)

Но пользователь может установить флажок, еслиЗначение true должно показывать одну строку на дату в таблице.

Без группировки по:

+-------------------------------+-------+
|  date  | trans_in | trans_out | total |
+--------+----------+-----------+-------+
|2019/5/3| $5.000   |    $0     | $5.000|
+--------+----------+-----------+-------+
|2019/5/3|   $0     |   $2.500  |-$2.500|
+--------+----------+-----------+-------+
|2019/5/4|  $1.000  |    $0     |$1.000 |
+--------+----------+-----------+-------+

И я пытаюсь сделать следующее:

+-------------------------------+-------+
|  date  | trans_in | trans_out | total |
+--------+----------+-----------+-------+
|2019/5/3| $5.000   |  $2.500   |$2.500 |
+--------+----------+-----------+-------+
|2019/5/4|  $1.000  |    $0     |$1.000 |
+--------+----------+-----------+-------+

Я уже пытался сделать

resultado = Asiento.objects.filter(
    Empresa=request.session['codEmp'],
    codcta=cod_cta
).exclude(anulado='S').order_by(date).values('date').annotate(
    dcount=Count('date')
)

Использование аннотации, но это не работает!Я действительно пока не могу понять, как упростить группировку.

Позже в коде я перебираю цикл for resultado, чтобы добавить и вычесть сумму денег для каждого объекта в наборе запросов.

for asiento in resultado:
    add = add+asiento.add
    sub = sub+asiento.sub
    asiento.total = asiento.add-asiento.sub

total = add-sub

ОБНОВЛЕНО:

Я прогрессировал в проблеме, поэтому я добавляю больше информации, чтобы решить эту проблему.Я использую следующий запрос:

resultado = Asiento.objects.filter(Empresa=request.session['codEmp'], codcta=cod_cta,
                                                               **query_kwargs).exclude(anulado='S')\
                                .order_by(orden).values('feasto').aggregate(dcount=Count('feasto'),
                                                                            debe=Sum('debe'), haber=Sum('haber'))

И он работает нормально!Печать resultado:

{'dcount': 3, 'debe': Decimal('27602.23'), 'haber': Decimal('0.00')}

Это правильно, потому что в запросе три объекта, все с одинаковой датой, и он правильно добавляет debe (кредит).

Нотеперь я не могу понять, как правильно отобразить его в шаблоне, поскольку итерация с {% for asiento in resultado %} печатает три строки с одинаковой датой.И я хочу только одну строку за аналогичную дату .

Также я не могу получить эти атрибуты строк, которые не соответствуют синтаксису .values().aggregate()... и т. Д.

1 Ответ

1 голос
/ 23 марта 2019

Я не совсем уверен, что вы пытаетесь сделать. Это либо для суммирования каждой даты, либо для суммирования всех итогов. Я предоставил способы сделать оба.

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

resultado = Asiento.objects.filter(
    Empresa=request.session['codEmp'],
    codcta=cod_cta
).exclude(anulado='S').order_by(date).values('date').annotate(
    dcount=Count('date'),
    add_sum=Sum('add'),
    sub_sum=Sum('sub'),
).annotate(
    total=F('add_sum')+F('sub_sum')
)

Это даст вам каждую дату с полями, представляющими add_sum, sub_sum и total. Если вы хотите объединить все итоги всех дат, то вам нужно сделать следующее:

print(resultado.aggregate(total_all=Sum('total'))['total_all'])
...