2012-11-13 222 views
1

我無法將寫正確的Python腳本,做什麼,我可以在MYSQL如何通過ID和訂購組通過計數在Django

完成下面是實現正是我想要的SQL查詢。我在pythonGROUP BY聲明中被絆倒。

SELECT COUNT(story_id) AS theCount, `headline`, `url` from tracking 
GROUP BY `story_id` 
ORDER BY theCount DESC 
LIMIT 20 

這是我在python到目前爲止所擁有的。這查詢的所有文章都很好,但缺少基於COUNT的任何種類的groupby()order_by()

articles = ArticleTracking.objects.all().filter(date__range=(start_date, end_date))[:20] 

article_info = []  
for article in articles: 
    this_value = { 
     "story_id":article.story_id, 
     "url":article.url, 
     "headline":article.headline, 
     } 

    article_info.append(this_value) 

回答

7

正確的做法是使用聚合。

articles = ArticleTracking.objects.filter(date__range=(start_date, end_date)) 
articles = articles.values('story_id', 'url', 'headline').annotate(count = Count('story_id')).order_by('-count')[:20] 

另請參閱Django中的聚合文檔。

https://docs.djangoproject.com/en/dev/topics/db/aggregation/

+0

工作就像一個魅力。謝謝! – bigmike7801

1

不要在家裏試試這個。

您可以添加GROUP_BY子句的查詢集這樣的:

qs = ArticleTracking.objects.all().filter(date__range=(start_date, end_date)) 
qs.query.group_by = ['story_id'] 
articles = qs[:20] 

這不是公共API的一部分,所以這取決於它可能會改變,也可能工作方式不同(或不可用)特別是你使用的數據庫後端。值得一提的是,我不確定在過濾器之前或之後應用group_by子句有什麼區別。不過,我已經在MySQL後端方面取得了成功。

+0

所以我很困惑,我應該做他或不?我只是在尋找這樣做的標準方式。 – bigmike7801

+0

這將完成,所以將使用原始SQL。 Django並未正式支持GROUP BY,因此請選擇您最喜歡的解決方法。 – dokkaebi