Django:模板表上不能GROUP BY

问题描述 投票:0回答:1

我正在尝试在模板中显示一个表格,该表格显示了日期的交易。

查询是:

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')
)

使用注释但它不起作用!我真的无法想象如何更容易分组。

稍后在代码中,我在qazxsw poi上使用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 %}等。

python django templates aggregate annotate
1个回答
1
投票

我不完全确定你要做什么。要么总计每个日期,要么总计所有总数。我已经提供了两种方法。

.values().aggregate()...

这将为您提供每个日期,其中包含表示add_sum,sub_sum和total的字段。如果你想汇总所有日期的所有总数,那么你想要这样做:

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')
)
© www.soinside.com 2019 - 2024. All rights reserved.