3

私は Django-Tagging を使用していますが、クラウドは必ずしも必要ではありません。ブログ エントリで使用されている最も人気のあるタグの限られたリストが必要なだけです。

以下を使用します。

[(tag.name, int(tag.count)) for tag in Tag.objects.usage_for_model(Post, counts=True)]

配列を返します (開発中に Lorem Ipsum を使用していることに注意してください)。

[(u'deposit', 5), (u'escorol', 1), (u'gratuitous', 8), (u'marquee', 2)]

しかし、それを注文して制限するには、次のようにする必要があります。

sorted([(tag.name, int(tag.count)) for tag in Tag.objects.usage_for_model(Post, counts=True)], key=lambda k:k[1], reverse=True)[:10]

これを行うためのよりきちんとした方法はありますか?あるに違いない気がする。

4

6 に答える 6

5

django の最新バージョンを使用している場合は、集計を使用できます。http://docs.djangoproject.com/en/dev/topics/db/aggregationそのページの例..

Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
于 2009-12-14T07:03:27.663 に答える
3

次のソートコードは、あなたが書いたものよりも少し読みやすいと思います。もちろん、それはabeyerによって述べられたソースの問題を取り除くことはありません

import operator
tags = Tag.objects.usage_for_model(Post, counts=True)
tags.sort(key=operator.attrgetter('count'), reverse=True)
于 2010-01-14T14:22:05.600 に答える
3

これには、 Django の{% regroup %}テンプレート タグが役立つ場合があります。tagsテンプレートのコンテキストにあると仮定します:

{% regroup tags|dictsort:"count" by count as sorted_tags %}
...
{% for count in sorted_tags %}
...
    {% for tag in count %}
    ...
    {% endfor %}
{% endfor %}
于 2009-12-13T05:52:36.207 に答える
1

とにかくすべてのタグをプルする必要があり、上位 n への制限が単にプレゼンテーションの問題である場合、Fragsworth の答えはおそらく進むべき道です。残りのタグを別の場所で使用していない場合、これは実際にはデータベース クエリで発生する必要があると主張します...「ORDER BY count DESC LIMIT n」を実行する必要があります。使用しないタグの束をプルしないようにするためのクエリ。

ただし、django-tagging は、常にタグ ID と名前でグループ化/ソートするようにハードコーディングされているようです。正しい解決策は、それに対してバグを報告し、上位 n 個のタグを返す API を公開することだと思います。

于 2009-12-14T01:45:40.877 に答える
0

Django-Tagging で上位のタグを取得するための私のアプローチは次のとおりです。

top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num')
于 2015-07-09T03:25:18.097 に答える
0

これには生のSQLを使用します:

trends = Tag.objects.raw("select tagging_tag.id, count(object_id) as counter from tagging_tag left join tagging_taggeditem on tagging_tag.id = tagging_taggeditem.tag_id group by tagging_tag.id order by counter DESC limit 10")
于 2011-05-17T08:32:12.893 に答える