我查询一个模型,
Members.objects.all()
Run Code Online (Sandbox Code Playgroud)
它返回说
Eric, Salesman, X-Shop
Freddie, Manager, X2-Shop
Teddy, Salesman, X2-Shop
Sean, Manager, X2-Shop
Run Code Online (Sandbox Code Playgroud)
我想要的是,知道最好的Django方法来触发group_by查询到我的数据库,就像,
Members.objects.all().group_by('designation')
Run Code Online (Sandbox Code Playgroud)
哪个当然不起作用.我知道我们可以在"django/db/models/query.py"上做一些技巧,但我很想知道如何在没有修补的情况下做到这一点.
为了简单起见,我有四个表(A、B、Category 和 Relation),Relation 表将Intensity
A 的 A存储在 B 中,Category 存储 B 的类型。
A <--- 关系 ---> B ---> 类别
(所以A和B的关系是n比n,当B和Category的关系是n比1时)
我的类别和需要一个ORM到组关系的记录,然后计算出Sum
的Intensity
每个(A类,A)(似乎简单到这里),然后我要诠释的最大计算Sum
每个类别。
我的代码是这样的:
A.objects.values('B_id').annotate(AcSum=Sum(Intensity)).annotate(Max(AcSum))
Run Code Online (Sandbox Code Playgroud)
哪个抛出错误:
django.core.exceptions.FieldError: Cannot compute Max('AcSum'): 'AcSum' is an aggregate
Run Code Online (Sandbox Code Playgroud)
具有相同错误的Django-group-by包。
有关更多信息,请参阅此 stackoverflow 问题。
我正在使用 Django 2 和 PostgreSQL。
有没有办法使用 ORM 来实现这一点,如果没有,使用原始 SQL 表达式的解决方案是什么?
经过一番挣扎,我发现我写的确实是一个聚合,但是我想要的是找出每个类别中每个A的AcSum的最大值。所以我想我必须在 AcSum Calculation 之后再次对结果进行分组。基于这种见解,我发现了一个堆栈溢出问题,它提出了相同的概念(这个问题是在 1 年,2 个月前提出的,没有任何公认的答案)。将另一个值('id')链接到集合既不能作为 group_by 也不能作为输出属性的过滤器,它会从集合中删除 AcSum。由于按结果集分组的变化,将 AcSum 添加到 values() 也不是一个选项。我想我想做的是根据列内的字段(即id)重新分组查询分组。有什么想法吗?