2013-04-26 54 views
2

我有一些MySQL的代碼看起來像這樣:Django的總和與計數

SELECT 
visitor AS team, 
COUNT(*) AS rg, 
SUM(vscore>hscore) AS rw, 
SUM(vscore<hscore) AS rl 
FROM `gamelog` WHERE status='Final' 
     AND date(start_et) BETWEEN %s AND %s GROUP BY visitor 

我想翻譯成查詢的Django的版本,未做多個查詢。這可能嗎?我讀了如何做Sum()Count(),但它似乎並沒有工作,當我想比較像我在做的兩個領域。

這是我能想出迄今最好的,但它沒有工作......

vrecord = GameLog.objects.filter(start_et__range=[start,end],visitor=i['id'] 
           ).aggregate(
              Sum('vscore'>'hscore'), 
              Count('vscore'>'hscore')) 

我也有使用'vscore>hscore'試過了,但也不能工作。有任何想法嗎?我需要儘可能少地使用查詢。

+0

即時猜測你'vscore'和'hscore'爲您示範田?你必須做一個'filter(vscore__gt = hscore)'並計算總和,我相信,但如果你想少做SQL查詢,我會使用'.extra()'並自己提供原始的sql。它會更加優化。 – 2013-04-26 12:59:36

+0

感謝limelights,我可能會這樣做。我真的不想使用原始SQL,但我想沒有其他辦法。 – Zamphatta 2013-04-26 14:48:02

回答

0

聚合僅適用於Django ORM中的單個字段。我查看了各種聚合函數的代碼,並注意到單字段限制是硬連線的。基本上,當你使用Sum(field)時,它只是記錄下來,然後將它傳遞給特定於數據庫的後端以轉換爲SQL並執行。顯然,聚合和註解在SQL中沒有標準化。

無論如何,你可能需要use a raw SQL query.

+0

謝謝。我一直希望避免原始SQL,以便該應用程序可以在任何數據庫中使用。我想我必須走這條路。 – Zamphatta 2013-04-26 14:49:16

+0

我認爲任何避免原始SQL的解決方案都需要作爲Django的更新來完成。 – 2013-04-26 17:40:56