我正在尝试通过一个小组加入一个领域。我可以按照我之前的一个问题中的描述在 MySQL 中处理它。但是,我现在迁移到 PostgreSQL,并且建议的解决方案在 PostgreSQL 9.6 中不起作用。根据Django 文档,可以使用此处或此处所述的 StringAgg 。我相信,在较新版本的 PostgreSQL 中,我无法执行以下行:
from django.db.models.sql.aggregates import Aggregate as SQLAggregate
Run Code Online (Sandbox Code Playgroud)
哪个抛出错误:
from django.db.models.sql.aggregates import Aggregate as SQLAggregate
ModuleNotFoundError: No module named 'django.db.models.sql.aggregates'
Run Code Online (Sandbox Code Playgroud)
如何使用StringAgg创建自己的聚合函数?
看来我不需要修改 StringAgg 来计算我需要的东西。我刚刚将其导入为他们的回答中描述的 Exprator :
from django.contrib.postgres.aggregates import StringAgg
Run Code Online (Sandbox Code Playgroud)
并将其与 values() 一起使用以按查询分组。由于字段不是字符串,因此我也必须使用 Cast:
from django.contrib.postgres.aggregates import StringAgg
from django.db.models.functions import Cast
from django.db.models import TextField
query.annotate(
AggregatedType = StringAgg(Cast('Types', TextField()),delimiter=',')
)
Run Code Online (Sandbox Code Playgroud) 为了简单起见,我有四个表(A、B、Category 和 Relation),Relation 表将IntensityA 的 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)重新分组查询分组。有什么想法吗?