Django-Tagging - 计数和排序顶部“标签”(有没有更好的解决方案?)

3 投票
6 回答
1571 浏览
提问于 2025-04-15 16:58

我在使用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 个回答

3

我觉得下面这个排序代码比你写的那个更容易理解。当然,它并没有解决abeyer提到的源头问题。

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

如果你在使用最新版本的Django,你可以使用聚合功能。聚合就是把一些数据合在一起进行计算,比如求和、平均值等。你可以在这个链接里找到相关的说明和示例:http://docs.djangoproject.com/en/dev/topics/db/aggregation

Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
3

Django中的{% regroup %}模板标签可能会对你有帮助。假设tags是在你模板中的上下文里:

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

撰写回答