Django聚合 - 表达式包含混合类型。您必须设置输出字段。

68

我正在尝试实现一个聚合查询,以下是我的代码:

TicketGroup.objects.filter(event=event).aggregate(
                           total_group=Sum(F('total_sold')*F('final_price')))

我在TicketGroup对象中有“total_sold”和“final_price”,我想做的就是对这些值进行求和和乘法运算,以获得所有TicketGroups的总销售额。

但是我收到了以下错误信息:

Expression contains mixed types. You must set output_field

我做错了什么?因为我将“total_group”作为输出字段调用了吗?

谢谢!

2个回答

89

在 Django 中,通过output_field来指定Sum的结果字段类型。

from django.db.models import FloatField, F
total_group=Sum(F('total_sold')*F('final_price'), output_field=FloatField())

完成这个任务应该没问题。


使用output_field=DecimalField()进行货币计算。 - undefined

53

为了使我的查询起作用,我不得不使用其他东西。仅使用 "output_field" 是无法解决它的。我需要在两个别名之间进行简单的除法运算。这些别名是两个注释的输出。

from django.db.models import FloatField, ExpressionWrapper, F

distinct_people_with_more_than_zero_bill = Task.objects.filter(
    billable_efforts__gt=0).values('report__title').annotate(
    Count('assignee', distinct=True)).annotate(
    Sum('billable_efforts'))

annotate(yy=ExpressionWrapper(F('billable_efforts__sum') / F('assignee__count'), output_field=FloatField()))
关键在于 ExpressionWrapper。没有它,你会收到一个错误:received non-expression(s)。Django 文档本身提供了提示,它说:如果你要组合的字段是不同类型的,你需要告诉 Django 返回什么样的字段。由于 F() 不直接支持 output_field,你需要用 ExpressionWrapper 包装表达式。
Link: https://docs.djangoproject.com/en/2.2/ref/models/expressions/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接