Django-Tagging - 计算并订购顶级“标签”(我的清洁解决方案是否有用?)

时间:2009-12-13 05:31:04

标签: python django django-tagging

我正在使用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]

有更简洁的方法吗?我觉得必须有。

6 个答案:

答案 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')