如何在Django中按ID和Order By计数

时间:2012-11-13 17:20:09

标签: python mysql sql django

我在编写正确的Python脚本时遇到了麻烦,该脚本可以完成我在MYSQL

中完成的工作

以下是完全符合我想要的SQL查询。我在python GROUP BY语句中被绊倒的地方。

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

这是我到目前为止python所拥有的内容。这可以很好地查询所有文章,但它缺少基于groupby()的任何order_by()COUNT

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)

2 个答案:

答案 0 :(得分:8)

执行此操作的正确方法是使用聚合。

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/

答案 1 :(得分: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后端获得了成功。