一尘不染

Django中的GROUP_CONCAT等效项

django

说我有下表称为fruits

id | type   | name
-----------------
 0 | apple  | fuji
 1 | apple  | mac
 2 | orange | navel

我的目标是最终得出一个不同的types列表,并以逗号分隔names

apple, 2, "fuji,mac"
orange, 1, "navel"

这可以GROUP_CONCAT在MySQL中轻松完成,但是与Django等效项却遇到了麻烦。到目前为止,这是我所缺少的,但是我缺少这些GROUP_CONCAT东西:

query_set = Fruits.objects.values('type').annotate(count=Count('type')).order_by('-count')

如果可能,我想避免使用原始SQL查询。

任何帮助将不胜感激!


阅读 823

收藏
2020-03-31

共2个答案

一尘不染

Django ORM不支持此功能。如果你不想使用原始SQL,则需要分组并加入。

2020-03-31
一尘不染

你可以创建自己的聚合函数(doc)

from django.db.models import Aggregate

class Concat(Aggregate):
    function = 'GROUP_CONCAT'
    template = '%(function)s(%(distinct)s%(expressions)s)'

    def __init__(self, expression, distinct=False, **extra):
        super(Concat, self).__init__(
            expression,
            distinct='DISTINCT ' if distinct else '',
            output_field=CharField(),
            **extra)

并简单地用作:

query_set = Fruits.objects.values('type').annotate(count=Count('type'),
                       name = Concat('name')).order_by('-count')

我正在使用django 1.8和mysql 4.0.3

2020-03-31