2017-07-18 12 views
1

クエリでグループを作成する方法が見つからないことに驚いています。Django GROUP BYフィールドの値

私は、クエリがqs設定されていると私はsome_propNoneあるエントリを除いているqsを考慮し、some_prop.valによってグループにしようとしています。

その後、私はこのような結果が出た後だろう、の値が[1, 2, 3]あるとしましょう:

{1: entries1, 2: entries2, 3: entries3} 

DjangoのORMは、このようなグループの結果に任意の機能を提供していますか?

+2

をあなたが投稿することができた場合は

result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author')) 

は今2列のクエリセットを含む結果:我々は明確な作者ごとのオブジェクトは、私たちのブックのテーブルに存在するどのように多くの書籍カウントすることあなたが試した質問についてもっとお答えしておきます。 – Aniket

答えて

3

は(私の知る限りでは)特定のDjangoのORMの方法はありませんが、あなたは、フィールドの値によってグループ化されたエントリーの辞書を取得するために次の操作を行うことができますにflat=True

  1. 使用.values_list()をデータベースに存在する値のリストを取得します(あらかじめそれらを知っていない場合)。また、我々はそれらのために気にしないよう、重複した値をelimintaeする.distinct()を使用します。

    value_list = MyModel.objects.values_list(
        'interesting_field', flat=True 
    ).distinct() 
    
  2. value_listを反復処理し、あなたの辞書を埋める:

    group_by_value = {} 
    for value in value_list: 
        group_by_value[value] = MyModel.objects.filter(interesting_field=value) 
    

group_by_value辞書には、キーの異なるとして含まれてい値をinteresting_fieldに、値としてのMyModelのエントリを含むクエリーセットオブジェクトを作成します。コメントレガシーの理由で、ここにこれを残し




Q&A style exampleを作成しました。これはCOUNT ... GROUP BY SQLクエリをシミュレートしています。

グループ化には.order_byを、モデルの.values()には.annotate()を使用する必要があります。、我々はannotate()を使用して、DjangoのORMにCOUNT ... GROUP BY SQL同等のクエリを実行することができます

values()order_by()django.db.modelsCount方法:ここで

は、上述した例である

我々のモデルがあることしてみましょう:

class Books(models.Model): 
    title = models.CharField() 
    author = models.CharField() 

を前提とします著者とカウント:

author | count 
------------|------- 
OneAuthor | 5 
OtherAuthor | 2  
    ...  | ... 
+0

ええ、私は集計したいとは思っていませんが、私は非常にはっきりと私は**値**でグループ化したいと言っていました。私は期待される出力も含めた。 – dabadaba

+0

@dabadaba私は編集をしました。 –