Python Django,两个注释结果之间的除法获胜';我计算不正确
我试图在queryset中对两个注释结果进行划分。Impression比click大得多,所以我应该得到十位小数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
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')
这管用!非常感谢。把一切都安排在德米尔菲尔德是更好的做法吗?