Python 如何在Django中按id分组和按计数排序

Python 如何在Django中按id分组和按计数排序,python,mysql,sql,django,Python,Mysql,Sql,Django,我在转换编写正确的Python脚本时遇到了困难,而这正是我在MYSQL中所能完成的 下面是SQL查询,它完全实现了我想要的功能。我在python中被GROUPBY语句绊倒了 SELECT COUNT(story_id) AS theCount, `headline`, `url` from tracking GROUP BY `story_id` ORDER BY theCount DESC LIMIT 20 以下是我目前在python中的内容。这可以查询所有文章,但它缺少任何基于计数的gro

我在转换编写正确的Python脚本时遇到了困难,而这正是我在MYSQL中所能完成的

下面是SQL查询,它完全实现了我想要的功能。我在python中被GROUPBY语句绊倒了

SELECT COUNT(story_id) AS theCount, `headline`, `url` from tracking
GROUP BY `story_id`
ORDER BY theCount DESC
LIMIT 20
以下是我目前在python中的内容。这可以查询所有文章,但它缺少任何基于计数的groupby或order\u by


不要在家里尝试这个

您可以将group_by子句添加到查询集中,如下所示:

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

这不是公共api的一部分,因此它可能会更改,并且根据您使用的特定db后端,它可能会以不同的方式工作或不可用。值得一提的是,我不确定在过滤器之前或之后应用group_by子句是否有任何区别。不过,我已经通过MySQL后端成功地实现了这一点。

不要在家里尝试

您可以将group_by子句添加到查询集中,如下所示:

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

这不是公共api的一部分,因此它可能会更改,并且根据您使用的特定db后端,它可能会以不同的方式工作或不可用。值得一提的是,我不确定在过滤器之前或之后应用group_by子句是否有任何区别。不过,我已经在MySQL后端成功地做到了这一点。

正确的方法是使用聚合

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中的聚合文档


正确的方法是使用聚合

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中的聚合文档


所以我很困惑,我该不该做他的?我只是在寻找实现这一点的标准方法。这将完成它,使用原始SQL也是如此。Django并没有正式支持GROUP BY,所以选择你最喜欢的工作环境。所以我很困惑,我应该做还是不做?我只是在寻找实现这一点的标准方法。这将完成它,使用原始SQL也是如此。Django没有正式支持GROUP BY,所以选择你最喜欢的工作环境。工作得很有魅力。谢谢工作得很有魅力。谢谢