使用 annotate 得到百分比给我没有逗号的结果 7/2 = 3 而不是 3.5

Use annotate to get percent give me resulte without comma 7/2 = 3 not 3.5

我想获得 :

的百分比值
nomberesteda * 100 / nomberhodor = 0.00

我使用这个查询集:

listilam = MediaSecParnt.objects.filter(date__range=[primary1, primary2]).values(
            'withsecondray__name','withdegrey__name','withsecondray_id','withdegrey_id')
.annotate(nomberhodor=Sum('nomberhodor'), nomberesteda=Sum('nomberesteda'), percent=((((F('nomberhodor')*100)/(F('nomberesteda'))))))
    

这里:

percent=((((F('nomberhodor')*100)/(F('nomberesteda'))))))

返回的百分比值不带逗号!

nomberhodor 列是整数并且与 nomberesteda 相同

结果如下:

<QuerySet [{'nomberhodor': 70, 'nomberesteda': 300, 'percent': 23},
{'nomberhodor': 64, 'nomberesteda': 150, 'percent': 42}, 
{'nomberhodor': 33, 'nomberesteda': 66, 'percent': 50}, 
{'nomberhodor': 50, 'nomberesteda': 200, 'percent': 25}, 
{'nomberhodor': 220, 'nomberesteda': 725, 'percent': 30},
{'nomberhodor': 567, 'nomberesteda': 900, 'percent': 63}, 
{'nomberhodor': 309, 'nomberesteda': 910, 'percent': 33}]>

应该是:

   <QuerySet [{'nomberhodor': 70, 'nomberesteda': 300, 'percent': 23.33},
{'nomberhodor': 64, 'nomberesteda': 150, 'percent': 42.66}, 
{'nomberhodor': 33, 'nomberesteda': 66, 'percent': 50.00}, 
{'nomberhodor': 50, 'nomberesteda': 200, 'percent': 25.00}, 
{'nomberhodor': 220, 'nomberesteda': 725, 'percent': 30.34},
{'nomberhodor': 567, 'nomberesteda': 900, 'percent': 63.00}, 
{'nomberhodor': 309, 'nomberesteda': 910, 'percent': 33.95}]>

您可以使用ExpressionWrapper [Django-doc]指定输出格式:

from django.db.models import ExpressionWrapper, FloatField

.annotate(
    nomberhodor=Sum('nomberhodor'),
    nomberesteda=Sum('nomberesteda'),
    percent=<b>ExpresssionWrapper(</b>
        F('nomberhodor')*100/F('nomberesteda'),
        <b>output_field=FloatField()</b>
    )
)

对于某些数据库,这是由于类型推断。在这种情况下,您可以使用 Cast:

from django.db.models import FloatField
from django.db.models.functions import Cast

.annotate(
    nomberhodor=Sum('nomberhodor'),
    nomberesteda=Sum('nomberesteda'),
    percent=<b>Cast(F('nomberhodor'), output_field=FloatField())</b> *
        100/F('nomberesteda')
    )
)

感谢:威廉·范·昂塞姆

percent=ExpressionWrapper(Cast(F('nomberhodor'), FloatField())/F('nomberesteda'),
    output_field=FloatField()))
    print(listilam):

<QuerySet [{'percent': 0.23333333333333334}, 
{'percent': 0.4266666666666667}, 
{'percent': 0.5}, { 'percent': 0.25},
 {'percent': 0.30344827586206896},
 {'percent': 0.63}, 
{'percent': 0.3395604395604396}]>

现在有效