2012-07-19 121 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