首页 > 解决方案 > 在 Python/Django 中将两个整数相除并返回浮点数

问题描述

我花了很长时间试图从 Sum(value1) 和 Sum(value2) 的除法中返回 Float 结果

这是我的代码:

kpiCapaTotal = reportKpiCeFilter.aggregate(kpiCapaTotal=Sum('operation_time') / Sum('load_time') * 100).get('kpiCapaTotal')

它返回:89,0 但正确的应该是 89,3

我试过了 :

kpiCapaTotal = reportKpiCeFilter.annotate(kpiCapaTotal=Sum('operation_time') / Cast(Sum('load_time'),FloatField()) * 100, output_field=FloatField()).get('kpiCapaTotal')

它返回一个错误:

“QuerySet.annotate() 收到非表达式:<django.db.models.fields.FloatField>。”

还有聚合:

kpiCapaTotal = reportKpiCeFilter.aggregate(kpiCapaTotal=Sum('operation_time') / Cast(Sum('load_time'),FloatField()) * 100,output_field=FloatField()).get('kpiCapaTotal')

错误:

“QuerySet.aggregate() 收到非表达式:<django.db.models.fields.FloatField>。”

我不知道如何将两个整数的和相除并返回一个浮点数,你知道吗?Python 版本:3.7 Django 版本:2.1

标签: pythondjango

解决方案


您的第二次和第三次尝试有一个小错误:

Cast(Sum('load_time'),FloatField())

您需要FloatField()作为关键字参数传递output_field

Cast(Sum('load_time'), output_field=FloatField())

你也不能传递output_field=FloatField()annotateor aggregate

此外,由于您只转换了表达式的一部分(其他部分属于不同类型),因此您需要使用ExpressionWrapper[Django docs]来设置output_field.

因此,您的查询将是:

from django.db.models import ExpressionWrapper

kpiCapaTotal = reportKpiCeFilter.aggregate(
    kpiCapaTotal=ExpressionWrapper(
        Sum('operation_time') / Cast(
            Sum('load_time'), output_field=FloatField()
        ) * 100,
        output_field=FloatField()
    )
).get('kpiCapaTotal')

推荐阅读