2012-07-19 102 views
2

我想在我的django应用程序中得到十个最重要的职位,但我无法做到这一点,因为我想不出一个正确的方式。在django中获得最多评论的帖子与django的评论

我目前正在使用django的评论框架,我已经看到了与aggregate or annotate这样做的可能性,但我可以弄清楚如何。

的事情将是:

  • 获取所有的帖子
  • 计算每个帖子的评论次数最多的少
  • 职位数(我有一个COMMENT_COUNT方法)
  • 订单
  • 获得第10(例如)

有没有“简单”或“Python化”的方式来做到这一点?我有点自意见框架丢失只能是通过模板标签从代码入店,并没有直接的(除非你想修改它)

任何帮助表示赞赏

回答

3

你说的没错,你需要使用注释和聚合功能。你需要做的是组通过并得到Comment模型object_pk的计数:

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值检索对象的C omments被附加到。

+0

这个解决方案似乎更干净比提出@j_syk我要去尝试一下,谢谢:) – 2012-07-19 15:03:17

+0

我有一个新的问题,我应该如何通过这种逆转关系来访问Post objets?如果可能,我想获得标题:) – 2012-07-19 16:35:49

+0

输出不是预期的结果。它重复条目:[{'object_pk':u'1','ocount':1},{'object_pk':u'1','ocount':1},{'object_pk':u'2', 'ocount':1}]在这种情况下,它应该是[{'object_pk':u'1','ocount':2},{'object_pk':u'2','ocount':1}] – 2012-07-19 16:45:00

2

注释将成为首选方式,部分原因是它会减少分贝查询,它基本上是一个单线程。虽然你的理论循环会起作用,但我敢打赌,你的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(没有隶属关系)

+0

当然我的循环是基于查询所有后期对象,这将以讨厌的超级查询结束。感谢这个解决方案:) – 2012-07-19 15:04:48