Django:无法在模板上进行 GROUP BY table
Django: Can't GROUP BY on a template table
我正在尝试在模板中显示 table,它显示交易及其日期。
查询是:
resultado = Asiento.objects.filter(
Empresa=request.session['codEmp'],
codcta=cod_cta
).exclude(anulado='S').order_by(date)
但用户可以勾选一个复选框,如果设置为真,则 table 中每个日期显示一行。
没有分组依据:
+-------------------------------+-------+
| date | trans_in | trans_out | total |
+--------+----------+-----------+-------+
|2019/5/3| .000 | [=12=] | .000|
+--------+----------+-----------+-------+
|2019/5/3| [=12=] | .500 |-.500|
+--------+----------+-----------+-------+
|2019/5/4| .000 | [=12=] |.000 |
+--------+----------+-----------+-------+
我想做的是:
+-------------------------------+-------+
| date | trans_in | trans_out | total |
+--------+----------+-----------+-------+
|2019/5/3| .000 | .500 |.500 |
+--------+----------+-----------+-------+
|2019/5/4| .000 | [=13=] |.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()...
等的行属性
我不完全确定你想做什么。它要么对每个日期进行总计,要么对所有总计求和。我已经提供了两种方法。
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 和总计的字段。如果您想汇总所有日期的所有总计,那么您需要这样做:
print(resultado.aggregate(total_all=Sum('total'))['total_all'])
我正在尝试在模板中显示 table,它显示交易及其日期。
查询是:
resultado = Asiento.objects.filter(
Empresa=request.session['codEmp'],
codcta=cod_cta
).exclude(anulado='S').order_by(date)
但用户可以勾选一个复选框,如果设置为真,则 table 中每个日期显示一行。
没有分组依据:
+-------------------------------+-------+
| date | trans_in | trans_out | total |
+--------+----------+-----------+-------+
|2019/5/3| .000 | [=12=] | .000|
+--------+----------+-----------+-------+
|2019/5/3| [=12=] | .500 |-.500|
+--------+----------+-----------+-------+
|2019/5/4| .000 | [=12=] |.000 |
+--------+----------+-----------+-------+
我想做的是:
+-------------------------------+-------+
| date | trans_in | trans_out | total |
+--------+----------+-----------+-------+
|2019/5/3| .000 | .500 |.500 |
+--------+----------+-----------+-------+
|2019/5/4| .000 | [=13=] |.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()...
等的行属性
我不完全确定你想做什么。它要么对每个日期进行总计,要么对所有总计求和。我已经提供了两种方法。
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 和总计的字段。如果您想汇总所有日期的所有总计,那么您需要这样做:
print(resultado.aggregate(total_all=Sum('total'))['total_all'])