3

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

有没有更简洁的方法来做到这一点?我觉得应该有。

4

6 回答 6

5

如果您使用的是最新版本的 django,则可以使用聚合。http://docs.djangoproject.com/en/dev/topics/db/aggregation该页面上的示例..

Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
于 2009-12-14T07:03:27.663 回答
3

Django 的{% regroup %}模板标签可能对此有用。假设tags在您的模板上下文中:

{% regroup tags|dictsort:"count" by count as sorted_tags %}
...
{% for count in sorted_tags %}
...
    {% for tag in count %}
    ...
    {% endfor %}
{% endfor %}
于 2009-12-13T05:52:36.207 回答
3

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

import operator
tags = Tag.objects.usage_for_model(Post, counts=True)
tags.sort(key=operator.attrgetter('count'), reverse=True)
于 2010-01-14T14:22:05.600 回答
1

如果您无论如何都需要拉出所有标签,并且对前 n 的限制只是一个演示文稿,那么 Fragsworth 的答案可能是要走的路。如果您没有在其他地方使用其余的标签,我认为这确实是数据库查询中应该发生的事情......您可能希望在查询以避免拉出一堆你不会使用的标签。

但是,似乎 django-tagging 是硬编码的,总是按标签 ID 和名称进行分组/排序。我想说正确的解决方案是针对该问题提交一个错误,然后公开一个 api,让您返回前 n 个标签。

于 2009-12-14T01:45:40.877 回答
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")
于 2011-05-17T08:32:12.893 回答
0

我在 Django-Tagging 中获取顶级标签的方法是:

top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num')
于 2015-07-09T03:25:18.097 回答