Django中GROUP_CONCAT的实现

在Django项目中,使用ORM实现GROUP_CONCAT方法解决ManyToMany字段拼接问题,通过设置allow_distinct=True避免重复拼接,实现高效查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中前端向Django后端请求用户信息列表,其中涉及到两个ManyToMany的field拼接,想到了用GROUP_CONCAT实现。期初采用了extra的方案,但因为涉及到sql语句的直接编写,通用性不强,且感觉有点LOW……因此希望用Django 的ORM实现。参考了hj009zzh的下面这个帖子:

DJANGO中实现GROUP_CONCAT方法,分组聚合

单个ManyToMany的field查询中没有任何问题,但是两个以上同时查询时,每一个field的输出都会出现重复拼接的现象,因此必须设

distinct=True

但此时会报错,提示GROUP_CONCAT不能设定DISTINCT,其原因在于定义GROUP_CONCAT时漏掉了一句:

class GroupConcat(Aggregate):

    function = 'GROUP_CONCAT'
    template = '%(function)s(%(distinct)s%(expressions)s%(ordering)s%(separator)s)'
    allow_distinct = True

    def __init__(self, expression, distinct=False, ordering=None, separator=',', **extra):
        super(GroupConcat, self).__init__(
            expression,
            distinct='DISTINCT ' if distinct else '',
            ordering=' ORDER BY %s' % ordering if ordering is not None else '',
            separator=' SEPARATOR "%s"' % separator,
            output_field=CharField(),
            **extra
        )

即“allow_distinct = True”,设定此项后,完美完成了所需功能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值