24

次のテーブルがあるとしますfruits

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

私の目標は、最終的に、 :の異なるtypesカンマ区切りのリストの数を考え出すことです。names

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

これはMySQLで簡単に実行できGROUP_CONCATますが、Djangoに相当するもので問題が発生しています。これは私がこれまでに持っているものですが、私はGROUP_CONCATものが欠けています:

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

可能であれば、生のSQLクエリの使用は避けたいと思います。

どんな助けでも大歓迎です!

ありがとう!=)

4

11 に答える 11

49

独自の集計関数を作成できます ( 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を使用しています

于 2015-07-10T09:43:39.450 に答える
3

テンプレートでこれを行ってもかまわない場合は、Djangoテンプレートタグの再グループ化によってこれが実現されます

于 2012-05-04T16:05:50.187 に答える
3

Django 1.8 以降、 Func() 式を使用できます。

query_set = Fruits.objects.values('type').annotate(
    count=Count('type'),
    name=Func(F('name'), 'GROUP_BY')
).order_by('-count')
于 2015-12-01T17:08:55.260 に答える
2

Django ORM はこれをサポートしていません。生の SQL を使用したくない場合は、グループ化して結合する必要があります。

于 2012-04-26T20:33:59.850 に答える
1

Django ORM ではサポートされていませんが、独自のアグリゲーターを構築できます。

GROUP_CONCATそれは実際には非常に簡単です。これは、 SQLite 用のハウツーへのリンクです: http://harkablog.com/inside-the-django-orm-aggregates.html

ただし、異なる SQL ダイアレクトを個別に処理する必要がある場合があることに注意してください。たとえば、SQLite ドキュメントには次のように書かれていgroup_concatます。

連結要素の順序は任意です

MySQL では順序を指定できますが、

GROUP_CONCATそれが現時点で Django に実装されていない理由かもしれません。

于 2014-04-08T23:31:45.777 に答える