Django -查询集-获取总数的有效方法

tcbh2hod  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(197)

我必须在querysetconcepto_liq中得到不同类型概念的总数(Rem,NR,NROS,etc),我正在为每种类型做一个过滤器(见下面的代码),有什么方法可以使它更有效吗?提前感谢!

tmp_value = concepto_liq.filter(tipo='Rem', empleado=empleado).aggregate(Sum('importe'))
remuneracion = 0 if not tmp_value['importe__sum'] else int(round(tmp_value['importe__sum'], 2) * 100)
tmp_value = concepto_liq.filter(tipo='NR', empleado=empleado).aggregate(Sum('importe'))
no_remunerativo = 0 if not tmp_value['importe__sum'] else int(round(tmp_value['importe__sum'], 2) * 100)
tmp_value = concepto_liq.filter(tipo='NROS', empleado=empleado).aggregate(Sum('importe'))
no_remunerativo_os = 0 if not tmp_value['importe__sum'] else int(round(tmp_value['importe__sum'], 2) * 100)
tmp_value = concepto_liq.filter(tipo='ApJb', empleado=empleado).aggregate(Sum('importe'))
aporte_jb = 0 if not tmp_value['importe__sum'] else int(round(tmp_value['importe__sum'], 2) * 100)
tmp_value = concepto_liq.filter(tipo='ApOS', empleado=empleado).aggregate(Sum('importe'))
aporte_os = 0 if not tmp_value['importe__sum'] else int(round(tmp_value['importe__sum'], 2) * 100)
67up9zun

67up9zun1#

您可以在同一查询中执行所有筛选:

from django.db.models import Q

results = concepto_liq.filter(empleado=empleado).aggregate(
    remuneracion=Sum('importe', filter=Q(tipo='Rem')),
    no_remunerativo=Sum('importe', filter=Q(tipo='NR')),
    no_remunerativo_os=Sum('importe', filter=Q(tipo='NROS')),
    aporte_jb=Sum('importe', filter=Q(tipo='ApJb')),
    aporte_os=Sum('importe', filter=Q(tipo='ApOS')),
)
results = {k: 0 if v is None else int(v * 100) for k, v in result.items()}

这将计算同一个查询中的所有项,并且只使用一个查询,而不是五个查询。

相关问题