2009-12-13 44 views
3

我使用Django標籤,我並不完全需要一個雲,我只是想一個有限的列表我的博客條目中使用的最受歡迎的標籤。Django-Tagging - 計數和排序頂部「標籤」(是否有一個更清潔的解決方案,我的?)

使用下列內容:

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

它返回一個數組(請注意我用Lorem存有而我開發):

[(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] 

有沒有更好的方法來做到這一點?我覺得必須有。

回答

3

Django的{% regroup %}模板標籤可能對此很有用。假設tags是在你的模板的上下文:

{% regroup tags|dictsort:"count" by count as sorted_tags %} 
... 
{% for count in sorted_tags %} 
... 
    {% for tag in count %} 
    ... 
    {% endfor %} 
{% endfor %} 
1

如果你總有需要把所有的標籤,並限制前n是一個簡單的演示文稿的事情,Fragsworth的答案很可能是要走的路。如果你沒有在別的地方使用其餘的標籤,我會爭辯說,這實際上應該是在數據庫查詢中發生的事情......你想要做一個'ORDER BY count DESC LIMIT n'on該查詢可以避免提取一堆您不打算使用的標籤。

但是,似乎django-tagging是硬編碼的,總是按標籤ID和名稱進行分組/排序。我會說正確的解決方案是提出一個反對的錯誤,並獲得一個暴露的API,可以讓你回到前n個標籤。

3

我發現下面的排序代碼一點比你寫了一個更具可讀性。當然,它不會刪除abeyer

import operator 
tags = Tag.objects.usage_for_model(Post, counts=True) 
tags.sort(key=operator.attrgetter('count'), reverse=True) 
+0

酷作品完美 – soField 2010-10-26 07:31:15

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") 
0

我在Django的標記讓頂部標籤的做法是:

top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num') 
相關問題