我正试图在我的django应用程序中获得十个评论最多的帖子,但我无法做到,因为我无法想到一个正确的方法。
我目前正在使用django评论框架,我已经看到了使用aggregate or annotate进行此操作的可能性,但我可以弄清楚如何。
事情将是:
有没有“简单”或“pythonic”的方式来做到这一点?我有点迷失,因为评论框架只能通过模板标签访问,而不是直接从代码访问(除非你想修改它)
感谢任何帮助
答案 0 :(得分:3)
您需要使用注释和聚合功能。您需要做的是分组并计算object_pk
模型的Comment
:
from django.contrib.comments.models import Comment
from django.db.models import Count
o_list = Comment.objects.values('object_pk').annotate(ocount=Count('object_pk'))
这会将以下内容分配给o_list
:
[{'object_pk': '123', 'ocount': 56},
{'object_pk': '321', 'ocount': 47},
...etc...]
然后,您可以对列表进行排序并将前10个切片:
top_ten_objects = sorted(o_list, key=lambda k: k['ocount'])[:10]
然后,您可以使用object_pk
中的值来检索附加注释的对象。
答案 1 :(得分:2)
Annotate将成为首选方式,部分原因是它会减少数据库查询,而且它基本上是一个单行程序。虽然你的理论循环会起作用,但是我打赌你的comment_count方法依赖于查询给定帖子的评论,这个帖子每个帖子都是1个查询,你过度讨厌!
posts_by_score = Comment.objects.filter(is_public=True).values('object_pk').annotate(
score=Count('id')).order_by('-score')
post_ids = [int(obj['object_pk']) for obj in posts_by_score]
top_posts = Post.objects.in_bulk(post_ids)
此代码无耻地改编自Django-Blog-Zinnia(无关联)