2013-07-31 18 views
1
class Term(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    term = models.CharField(max_length=255)    

嗨, 我嘗試次數從我的數據庫表中的重複/多個方面,但我得到的仍然是我的表中的所有項目({term: a, count: 1, term: a, count: 1,term: b, count: 1,...})的列表,而不是像{term: a, count: 12, term: b, count: 1}計數多個方面

有沒有人一個主意?

編輯:

ee = Term.objects.annotate(Count("term")).values("term", "term__count") 

結果:

[{'term': u'tes', 'term__count': 1}, {'term': u'tes', 'term__count': 1}, 

我期待什麼:

[{'term': u'tes', 'term__count': 2}, {'term': 'b', 'term__count': 1} 
+0

你試過了什麼?你是如何得到這份名單的?什麼是「計數」? –

+0

我使用django的count方法 – Azd325

+0

你可以發佈你的代碼,你在哪裏使用「django的count方法」? –

回答

2

https://docs.djangoproject.com/en/dev/topics/db/aggregation/ 說,有關的順序是非常重要的。另外,如果您在模型上有order_by,則會影響它。 如何...

ee = Term.objects.values("term").annotate(Count("term")).order_by() 
+0

有關注釋的Django officiel文檔:「使用所提供的聚合值列表(平均值,總和等等)來註釋QuerySet中的每個對象__over與QuerySet__中的對象相關的對象。」術語charfield是不是一個相關的對象不是?我們似乎不在annotate()函數的範圍內? – Ricola3D

+0

@ Ricola3D。即使所涉及的字段不是外鍵字段,它也適用於我(例如,只是一個布爾值)。 (正如我所說的,如果我在它的末尾沒有包含.order_by(),那麼模型自己的order_by設置會導致一個問題,使得它包含每個實例的單獨元素。) – jcfollower

+0

啊好的,這真的很醜,但這是有用的,以避免python代碼中的髒原始SQL! – Ricola3D

0

在SQL你不能這樣做,在只有一個查詢,你需要一個子查詢。我想這是與Django的相同,所以試試這個:

ee = Term.objects.extra(select={'count': "SELECT COUNT(term) FROM appname_term AS subtable WHERE subtable.term = appname_term.term"}) 

應該從EE與此行的數量增加計數屬性每學期。它在主查詢中對同一個關係應用子查詢。這相當於SQL的:

SELECT *, (
    SELECT COUNT(term) 
    FROM appname_term AS subtable 
    WHERE subtable.term = appname_term.term 
) AS count 
FROM appname_term 
+1

當Django的ORM提供完全有效的方法來完成這項工作時,絕對沒有理由使用原始SQL。檢查jcfollower的答案。 – knbk

+0

Django ORM中是否真的有這樣的功能? Django有關「annotate」的官方文檔告訴:「使用所提供的聚合值(平均值,總和等)列表來註釋QuerySet中的每個對象,這些值已經計算出來__overover與QuerySet__中的對象相關的對象。它說的是爲表格之間的關係工作,而不是爲同一張表的一行。這就是爲什麼1總是作爲計數返回的原因! – Ricola3D

+0

這就是爲什麼你需要使用'values()'_before_'annotate()'。否則,你計算每個獨特行的發生次數 - 每行都有一個唯一的id,所以它是1.如果你使用values('tem')。annotate()',你首先選擇'term'值,然後在計數之前先做一個SQL GROUP BY語句 - 準確獲取你想要的結果。文檔只是關於相關字段的唯一原因是因爲如果不在前面使用'values()',那麼註釋函數在同一張表上都沒有任何意義。它確實在同一張表的字段上按預期工作。 – knbk