You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL 9.6中通过Django ORM使用StringAgg聚合函数

解决PostgreSQL下Django的字段分组拼接问题

我之前也遇到过一模一样的情况——从MySQL迁移到PostgreSQL 9.6后,原来用来做字段分组拼接的方案直接失效,一开始还想着要自定义StringAgg聚合函数,甚至去碰django.db.models.sql.aggregates那个模块结果报错,后来才发现完全没必要自己折腾,Django已经为PostgreSQL封装好了现成的工具!

为什么之前的导入会报错

你尝试导入的django.db.models.sql.aggregates属于Django内部底层模块,不仅版本迭代中可能被调整/移除,而且官方已经把PostgreSQL专属的聚合函数封装在更易用的位置了,完全不需要去碰这个底层模块。

正确的实现方式

其实直接用Django提供的StringAgg就能搞定,只是因为你的字段不是字符串类型,需要配合Cast函数做类型转换,具体步骤如下:

  1. 先导入所需的模块:
from django.contrib.postgres.aggregates import StringAgg
from django.db.models.functions import Cast
from django.db.models import TextField
  1. 在查询中结合annotate(如果需要分组的话记得先调用values()指定分组字段):
# 示例:按category_id字段分组,拼接types字段
query = YourModel.objects.values('category_id').annotate(
    aggregated_types=StringAgg(Cast('types', TextField()), delimiter=',')
)

关键细节说明

  • 类型转换的必要性:StringAgg只能处理字符串类型的字段,如果你的types字段是数字、枚举或其他非字符串类型,必须用Cast转换成TextField,否则会触发数据库层面的类型错误;
  • 分组逻辑:如果需要按特定字段分组拼接,一定要先调用values('分组字段'),否则annotate会对整个查询集的所有记录做聚合,而不是按组生成结果;
  • 版本兼容性:这个方案适用于Django 1.10及以上版本,PostgreSQL 9.6完全支持,和你的环境匹配。

内容的提问来源于stack exchange,提问作者Azee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:56