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の一部ではないため、変更される可能性があり、使用している特定のdbバックエンドに応じて動作が異なる(または使用できない)可能性があります。フィルタの前または後にgroup_by句を適用しても、違いが生じるかどうかはわかりません。ただし、MySQLバックエンドを使用してこれで成功しました。

于 2012-11-13T19:43:24.660 に答える