2017-07-18 67 views
1

令人驚訝的是,我找不到通過查詢創建組的方法。Django GROUP BY字段值

我有一個查詢設置qs,我通過some_prop.val試圖組,考慮qs被排除項,其中some_propNone

假設值是[1, 2, 3],那麼我會是這樣的結果後:

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

是否Django的ORM提供任何功能,以團體成績也是這樣嗎?

+2

如果你可以發佈更多關於您嘗試的查詢將有利於我們回答。 – Aniket

回答

3

沒有具體的Django的ORM的方式(據我所知),但你可以做以下的話,被現場的值進行分組條目的詞典:

  1. 使用.values_list()flat=True到獲取數據庫中現有值的列表(如果您事先不知道)。還可以使用.distinct()到elimintae重複的值,因爲我們不爲那些關心:

    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中的值以及查詢集對象的值,每個對象都包含MyModelinteresting_field=a value from value_list的條目。




離開這個在這裏發表評論遺留原因。

我製作了一個Q&A style example,它模擬了COUNT ... GROUP BY SQL查詢。

基本上,您需要利用.order_by進行分組,.annotate()用於指定型號的.values()

這裏是上面提到的例如:

我們可以對Django的ORM一個COUNT ... GROUP BY SQL等效的查詢,與使用annotate()values()order_by()django.db.modelsCount方法:

讓我們的模式是:

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

讓我們假設我們要計算每個不同的作者很多書對象是如何在我們的書籍表存在:

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

現在結果包含查詢集有兩列:作者和計數:

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

是的,但我不想數數組,我非常清楚地說我想按**值**分組,我怎麼能更清楚?我甚至包括了預期的產出。 – dabadaba

+0

@dabadaba我做了一個修改,看看。 –