令人驚訝的是,我找不到通過查詢創建組的方法。Django GROUP BY字段值
我有一個查詢設置qs
,我通過some_prop.val
試圖組,考慮qs
被排除項,其中some_prop
爲None
。
假設值是[1, 2, 3]
,那麼我會是這樣的結果後:
{1: entries1, 2: entries2, 3: entries3}
是否Django的ORM提供任何功能,以團體成績也是這樣嗎?
令人驚訝的是,我找不到通過查詢創建組的方法。Django GROUP BY字段值
我有一個查詢設置qs
,我通過some_prop.val
試圖組,考慮qs
被排除項,其中some_prop
爲None
。
假設值是[1, 2, 3]
,那麼我會是這樣的結果後:
{1: entries1, 2: entries2, 3: entries3}
是否Django的ORM提供任何功能,以團體成績也是這樣嗎?
沒有具體的Django的ORM的方式(據我所知),但你可以做以下的話,被現場的值進行分組條目的詞典:
使用.values_list()
與flat=True
到獲取數據庫中現有值的列表(如果您事先不知道)。還可以使用.distinct()
到elimintae重複的值,因爲我們不爲那些關心:
value_list = MyModel.objects.values_list(
'interesting_field', flat=True
).distinct()
現在通過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
和interesting_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.models
的Count
方法:讓我們的模式是:
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 ... | ...
是的,但我不想數數組,我非常清楚地說我想按**值**分組,我怎麼能更清楚?我甚至包括了預期的產出。 – dabadaba
@dabadaba我做了一個修改,看看。 –
如果你可以發佈更多關於您嘗試的查詢將有利於我們回答。 – Aniket