使用django评论获取django中评论最多的帖子

时间:2012-07-19 14:38:43

标签: django comments

我正试图在我的django应用程序中获得十个评论最多的帖子,但我无法做到,因为我无法想到一个正确的方法。

我目前正在使用django评论框架,我已经看到了使用aggregate or annotate进行此操作的可能性,但我可以弄清楚如何。

事情将是:

  • 获取所有帖子
  • 计算每篇博文的评论数量(我有一个comment_count方法)
  • 将帖子从评论最多的内容排序为
  • 获得前10个(例如)

有没有“简单”或“pythonic”的方式来做到这一点?我有点迷失,因为评论框架只能通过模板标签访问,而不是直接从代码访问(除非你想修改它)

感谢任何帮助

2 个答案:

答案 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(无关联)