Django -tagging- 수를 세고 주문하는 상위 "태그"를 주문합니다 (광산에 대한 더 깨끗한 솔루션이 있습니까?)

StackOverflow https://stackoverflow.com/questions/1895638

  •  19-09-2019
  •  | 
  •  

문제

나는 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]

이것을 할 수있는 깔끔한 방법이 있습니까? 나는 있어야한다고 생각합니다.

도움이 되었습니까?

해결책

장고의 {% regroup %} 템플릿 태그는 이것에 유용 할 수 있습니다. 가정합니다 tags 템플릿의 맥락에 있습니다.

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

다른 팁

최신 버전의 Django를 사용하는 경우 집계를 사용할 수 있습니다. http://docs.djangoproject.com/en/dev/topics/db/aggregation 해당 페이지의 예 ..

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)

어쨌든 모든 태그를 뽑아야하고 상단 N으로의 한계가 단순히 프레젠테이션 일이라면 Fragsworth의 대답은 아마도 갈 길입니다. 다른 곳에서 나머지 태그를 사용하지 않는다면, 이것이 실제로 데이터베이스 쿼리에서 일어나야 할 일이라고 주장 할 것입니다. 쿼리는 사용하지 않을 수많은 태그를 당기지 않도록 쿼리입니다.

그러나 django-tagging은 항상 태그 ID 및 이름별로 그룹/정렬하도록 하드 코딩 된 것으로 보입니다. 올바른 해결책은 그것에 대해 버그를 제출하고 API 노출을 얻는 것이 상위 N 태그를 되 찾을 수 있다고 말합니다.

나는 이것을 위해 원시 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-tagging에서 최고 태그를 얻는 데 대한 나의 접근 방식은 다음과 같습니다.

top_tags = Tag.objects.annotate(num=Count('taggit_taggeditem_items')).order_by('-num')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top