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 个回答
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 %}