1

我无法转换编写正确的 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)
4

2 回答 2

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/

于 2012-11-14T02:22:49.910 回答
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 后端取得了成功。

于 2012-11-13T19:43:24.660 回答