【发布时间】:2018-06-21 22:57:02
【问题描述】:
为了简单起见,我有四个表(A、B、Category 和 Relation),Relation 表将 A 的 Intensity 存储在 B 中,Category 存储 B 的类型。
A B ---> 类别
(所以A和B的关系是n比n,当B和Category的关系是n比1)
我需要一个 ORM 来按类别和 A 对关系记录进行分组,然后在每个 (Category, A) 中计算 Sum 的 Intensity (直到这里看起来很简单),然后我想注释计算的 Sum 的 Max在每个类别中。
我的代码是这样的:
A.objects.values('B_id').annotate(AcSum=Sum(Intensity)).annotate(Max(AcSum))
哪个会引发错误:
django.core.exceptions.FieldError: Cannot compute Max('AcSum'): 'AcSum' is an aggregate
Django-group-by 包同样的错误。
更多信息请参见this stackoverflow question。
我正在使用 Django 2 和 PostgreSQL。
有没有办法使用 ORM 来实现这一点,如果没有,使用原始 SQL 表达式的解决方案是什么?
更新
经过一番挣扎,我发现我写的确实是一个聚合,但是我想要找出每个类别中每个 A 的最大 AcSum。所以我想我必须在 AcSum Calculation 之后再次对结果进行分组。基于这种见解,我发现了一个stack-overflow question,它提出了相同的概念(这个问题是在 1 年 2 个月前提出的,没有任何公认的答案)。 将另一个值('id')链接到集合既不能用作 group_by,也不能用作输出属性的过滤器,它会从集合中删除 AcSum。由于按结果集分组的变化,将 AcSum 添加到 values() 也不是一个选项。 我想我想要做的是根据列内的字段(即 id)重新分组查询分组。 有什么想法吗?
【问题讨论】:
标签: python django postgresql orm aggregate