小编Aze*_*zee的帖子

如何使用 DjangoORM 在 PostgreSQL 9.6 中使用 StringAgg 聚合函数

我正在尝试通过一个小组加入一个领域。我可以按照我之前的一个问题中的描述在 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)

python django postgresql concatenation aggregate-functions

3
推荐指数
1
解决办法
2294
查看次数

计算 Django ORM 中按查询分组的带注释字段的总和的最大值?

为了简单起见,我有四个表(A、B、Category 和 Relation),Relation 表将IntensityA 的 A存储在 B 中,Category 存储 B 的类型。

A <--- 关系 ---> B ---> 类别

(所以A和B的关系是n比n,当B和Category的关系是n比1时)

我的类别和需要一个ORM到组关系的记录,然后计算出SumIntensity每个(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)重新分组查询分组。有什么想法吗?

python django postgresql orm aggregate

2
推荐指数
1
解决办法
2408
查看次数