Django,两个注释结果之间的划分将无法正确计算

viv*_*ill 9 python django floating-point annotate

我试图在queryset中的两个注释结果之间进行划分.印象比点击大得多,所以我应该得到十分之一小数.

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')
Run Code Online (Sandbox Code Playgroud)

麻烦在这里:

ctr_monthly= Sum('click')/Sum('impression'))
Run Code Online (Sandbox Code Playgroud)

在模板中我有:

<td>{{ googleData.ctr_monthly | floatformat:2}} </td>
Run Code Online (Sandbox Code Playgroud)

结果是0.00.如果我执行ctr_final = click*impression,它会正确生成.Click&Impression都是整数字段.

我试过使用float(),给了我一个语法错误.

另一个问题是:制作像这样的查询集的最佳实践什么?有什么方法可以将它分解为几段简短的代码并使其更整洁可读?

谢谢〜

Bob*_*ort 28

使用较新版本的Django,您可以使用新Func对象将值转换为FloatFieldsDecimalFields之前Sum.

from django.db.models.functions import Cast
from django.db.models import FloatField
ctr_monthly= Cast(Sum('click'), FloatField())/Cast(Sum('impression')), FloatField())
Run Code Online (Sandbox Code Playgroud)

即使是使用旧版本的Django的,你也许能够只指定output_fieldSumctr_monthly注释,像这样前:

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')
Run Code Online (Sandbox Code Playgroud)