Python Django标签-计数和订购顶部“;标签;(有更清洁的解决方案吗?)

Python Django标签-计数和订购顶部“;标签;(有更清洁的解决方案吗?),python,django,django-tagging,Python,Django,Django Tagging,我使用的是Django标签,我并不需要云,我只需要在我的博客文章中使用的最流行的标签的有限列表 使用以下命令: [(tag.name, int(tag.count)) for tag in Tag.objects.usage_for_model(Post, counts=True)] 它返回一个数组(注意,我在开发时使用的是Lorem Ipsum): 但为了订购和限制它,我需要这样做: sorted([(tag.name, int(tag.count)) for tag in Tag.obje

我使用的是Django标签,我并不需要云,我只需要在我的博客文章中使用的最流行的标签的有限列表

使用以下命令:

[(tag.name, int(tag.count)) for tag in Tag.objects.usage_for_model(Post, counts=True)]
它返回一个数组(注意,我在开发时使用的是Lorem Ipsum):

但为了订购和限制它,我需要这样做:

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]
有没有更整洁的方法?我觉得肯定有。

Django的模板标签可能对这一点有用。假设
标记
位于模板的上下文中:

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

如果你无论如何都需要拉所有的标签,并且限制到前n仅仅是一个演示的事情,Fragsworth的答案可能是最好的选择。如果您没有在其他地方使用剩余的标记,我认为这确实应该在数据库查询中发生……您应该在查询中执行“按计数排序描述限制n”,以避免拉取一堆您不打算使用的标记


然而,django标记似乎是硬编码的,总是按标记ID和名称分组/排序。我认为正确的解决方案是针对这一点提交一个bug,并公开一个api,它将返回前n个标记。

如果您使用的是最新版本的django,那么可以使用聚合。那页上有一个例子

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

我发现下面的排序代码比您编写的代码可读性更强。当然,它并没有消除abeyer所说的源问题

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

我使用原始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")

我在Django标记中获取顶级标记的方法是:

top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num')
top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num')