使用 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}]>
现在有效
我想获得 :
的百分比值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}]>
现在有效