我正在使用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]
有更简洁的方法吗?我觉得必须有。
答案 0 :(得分:5)
如果您使用的是最新版本的django,则可以使用聚合。 http://docs.djangoproject.com/en/dev/topics/db/aggregation该页面上的一个示例..
Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
答案 1 :(得分:3)
Django的{% regroup %}
模板标签可能对此有用。假设tags
位于模板的上下文中:
{% regroup tags|dictsort:"count" by count as sorted_tags %}
...
{% for count in sorted_tags %}
...
{% for tag in count %}
...
{% endfor %}
{% endfor %}
答案 2 :(得分:3)
我发现以下排序代码比您编写的代码更具可读性。当然,它不会消除abeyer所述的源问题
import operator
tags = Tag.objects.usage_for_model(Post, counts=True)
tags.sort(key=operator.attrgetter('count'), reverse=True)
答案 3 :(得分:1)
如果您还需要拉出所有标签,并且前n的限制只是一个演示文稿,Fragsworth的答案可能是要走的路。如果你没有在其他地方使用剩余的标签,我认为这确实应该在数据库查询中发生......你会想做一个'ORDER BY count DESC LIMIT n'on查询以避免拉出一堆你不会使用的标签。
然而,似乎django-tagging被硬编码为始终按标签ID和名称进行分组/排序。我说正确的解决方案就是提交一个bug来反对它,并获得一个api暴露,它将返回前n个标签。
答案 4 :(得分: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")
答案 5 :(得分:0)
我在Django-Tagging中获取top标签的方法是:
top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num')