Django 用于计算百分比的聚合查询集始终返回0

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}

我正在尝试编写一个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[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)
。谢谢是的,我希望演员们也能工作。也许这应该作为一个问题报告。