Django聚合 - 表达式包含混合类型。您必须设置output_field

时间:2016-07-23 20:23:58

标签: django aggregate-functions django-queryset django-orm

我正在尝试实现聚合查询,这是我的代码:

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

我在TicketGroup对象中有'total_sold'和'final_price',而我想要做的就是求和并乘以值以得到所有TicketGroup的总销售额。

我得到的只是这个错误:

  

表达式包含混合类型。您必须设置output_field

我做错了什么,因为我把'total_group'称为我的输出字段?

谢谢!

2 个答案:

答案 0 :(得分:22)

output_field Django表示为Sum的结果提供字段类型。

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

应该这样做。

答案 1 :(得分:0)

为了使查询正常工作,我不得不使用其他方法。只是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 。 否则,您会得到一个错误:收到的非表达式

有关Django文档本身的提示是:

  

如果要合并的字段属于不同类型,则需要   告诉Django将返回哪种字段。由于F()不   直接支持output_field您将需要包装表达式   使用ExpressionWrapper

链接:https://docs.djangoproject.com/en/2.2/ref/models/expressions/