Django 用于计算百分比的聚合查询集始终返回0
我正在尝试编写一个Django查询集,它汇总系统中已验证合同的百分比。但我似乎无法让它发挥作用——我总是得到“0”的百分比,尽管我知道它应该接近25% 我目前的努力如下:Django 用于计算百分比的聚合查询集始终返回0,django,Django,我正在尝试编写一个Django查询集,它汇总系统中已验证合同的百分比。但我似乎无法让它发挥作用——我总是得到“0”的百分比,尽管我知道它应该接近25% 我目前的努力如下: In[1]: Contract.objects.aggregate( total=Count('pk'), verified=Count('pk', filter=Q(verified_date__isnull=False) ) Out[1]: {'total': 4000, 'verified': 1000}
In[1]: Contract.objects.aggregate(
total=Count('pk'),
verified=Count('pk', filter=Q(verified_date__isnull=False)
)
Out[1]: {'total': 4000, 'verified': 1000}
In[2]: Contract.objects.aggregate(
percentage=Count('pk', filter=Q(verified_date__isnull=False)) / Count('pk')
)
Out[2]: {'percentage': 0}
In[3]: Contract.objects.aggregate(
percentage=Count('pk', filter=Q(verified_date__isnull=False), output_field=DecimalField()) / Count('pk', output_field=DecimalField())
)
Out[3]: {'percentage': Decimal('0')}
在除法之前,需要将值设为十进制,只需乘以1.0即可确保:
from django.db.models import ExpressionWrapper, Count, Value, DecimalField
Contract.objects.aggregate(perc=ExpressionWrapper(
Count('pk', filter=Q(verified_date__isnull=False)) * Value(1.0)
/ (Count('pk') * Value(1.0)),
output_field=DecimalField()))
我使用ExpressionWrapper
来设置聚合值本身的output\u字段
参数
更新:
在查看了使用output\u field
进行强制转换应该有效的评论后,我发现这也有效:
from django.db.models import Count, DecimalField
from django.db.models.functions import Cast
Contract.objects.aggregate(perc=
Cast(
Count('pk', filter=Q(verified_date__isnull=False)),
DecimalField(max_digits=30, decimal_places=4)
)
/ Cast(
Count('pk'),
DecimalField(max_digits=30, decimal_places=4)
)
)
上面提到的问题解释了为什么
output\u字段
不起作用。似乎是未来的待定:-)您的应用程序认为百分比列是整数,而不是小数。当你计算Count('pk',filter=Q(verified\u date\uu isnull=False))/Count('pk')
,结果是0.25,四舍五入为0,因为百分比是一个整数。我不认为你需要乘以值(1.0)
(我可能错了)。啊,有趣。看来我误解了输出\u字段
参数的工作原理。我想那会帮我做演员。看起来我只需要第二次计数的值(1.0)
。谢谢是的,我希望演员们也能工作。也许这应该作为一个问题报告。