Python Django,两个注释结果之间的除法获胜';我计算不正确

Python Django,两个注释结果之间的除法获胜';我计算不正确,python,django,floating-point,annotate,Python,Django,Floating Point,Annotate,我试图在queryset中对两个注释结果进行划分。Impression比click大得多,所以我应该得到十位小数 def get_queryset(self): return googleData.objects.filter(account=self.account_name).\ values('date').\ annotate(Sum('click'), Sum('impression'), Sum('converted_c

我试图在queryset中对两个注释结果进行划分。Impression比click大得多,所以我应该得到十位小数

def get_queryset(self):
        return googleData.objects.filter(account=self.account_name).\
            values('date').\
            annotate(Sum('click'), Sum('impression'), Sum('converted_click'),
                     Sum('conversion_value'), Sum('cost'), Sum('conversion_value'), ctr_monthly= Sum('click')/Sum('impression')).\
            order_by('-date')
这里的麻烦是:

ctr_monthly= Sum('click')/Sum('impression'))
在模板中,我有:

<td>{{ googleData.ctr_monthly | floatformat:2}} </td>
{{googleData.ctr_monthly}floatformat:2}
结果是0.00。 如果我执行ctr_final=单击*impression,它将正确生成。 Click和Impression都是整型字段

我尝试使用float(),但出现语法错误

另一个问题是:制作这样的查询集的最佳实践是什么?有没有办法把它分解成几段短代码,让它更简洁易读


谢谢~

据我所知,没有一种使用ORM的方法可以做到这一点

Sum()
函数返回的字段类型与输入的字段类型相同(即IntegerField()将始终返回整数)。您可以使用像
ExpressionWrapper
这样的函数强制输出为浮点,但在这种情况下这没有帮助,因为太晚了:两个整数的除法已经返回了另一个整数

要解决您的问题,请从查询中删除
ctr\u monthly
部分,并创建一个简单的模板标记,将这两个数字转换为浮点数并进行除法

然后,您的模板将如下所示:
{{monthly\u ctr(googleData.click,googleData.impression)| floatformat:2}
对于较新版本的Django,您可以使用新的
Func
对象将值强制转换为
FloatFields
DecimalFields

from django.db.models.functions import Cast
from django.db.models import FloatField
ctr_monthly= Cast(Sum('click'), FloatField())/Cast(Sum('impression')), FloatField())
即使使用较旧版本的Django,您也可以在注释ctr_之前,在
Sum
上指定
output_字段,如下所示:

from django.db.models import F
def get_queryset(self):
    return googleData.objects.filter(
        account=self.account_name
    ).values('date').annotate(
        click_sum=Sum(
            'click',
            output_field=FloatField()
        ),
        impression_sum=Sum(
            'impression',
            output_field=FloatField()
        ),
        converted_click_sum=Sum('converted_click'),
        conversion_value_sum=Sum('conversion_value'),
        cost_sum=Sum('cost')
    ).annotate(
        ctr_monthly=F('click_sum') / F('impression_sum')
    ).order_by('-date')

这管用!非常感谢。把一切都安排在德米尔菲尔德是更好的做法吗?