问题描述
我想获得以下百分比值: 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 culomn是intiger,与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,'percent': 23.33},'percent': 42.66},'percent': 50.00},'percent': 25.00},'percent': 30.34},'percent': 63.00},'percent': 33.95}]>
解决方法
您可以使用ExpressionWrapper
[Django-doc]指定输出格式:
from django.db.models import ExpressionWrapper,FloatField
.annotate(
nomberhodor=Sum('nomberhodor'),nomberesteda=Sum('nomberesteda'),percent=ExpresssionWrapper(
F('nomberhodor')*100/F('nomberesteda'),output_field=FloatField()
)
)
对于某些数据库,这是由于类型推断引起的。在这种情况下,您可以使用Cast
:
from django.db.models import FloatField
from django.db.models.functions import Cast
.annotate(
nomberhodor=Sum('nomberhodor'),percent=Cast(F('nomberhodor'),output_field=FloatField()) *
100/F('nomberesteda')
)
)
,
thnks:威廉·范·昂塞姆
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}]>
它现在可以工作