使用django通过评论计数订购条目

时间:2011-11-21 17:04:11

标签: django django-queryset django-comments

我需要从数据库中获取带有评论计数的条目。我可以用django的评论框架来做吗?我也在使用一个不使用GenericForeignKeys的投票申请表,我得到的分数如下:

class EntryManager(models.ModelManager):
    def get_queryset(self):
        return super(EntryManager,self).get_queryset(self).all().annotate(\
            score=Sum("linkvote__value"))

但是当有外国人我被困住了。你有什么想法吗?

额外的解释:我需要获取这样的条目:

id | body | vote_score | comment_score |
 1 |  foo |         13 |             4 |
 2 |  bar |          4 |             1 |

这样做之后,我可以通过comment_score订购它们。 :)

满足所有回复。

1 个答案:

答案 0 :(得分:1)

显然,使用反向泛型关系(或一般的额外过滤器)进行注释仍然是open ticket(另请参阅corresponding documentation)。在此问题得到解决之前,我建议在extra查询中使用原始SQL,如下所示:

return super(EntryManager,self).get_queryset(self).all().annotate(\
    vote_score=Sum("linkvote__value")).extra(select={
        'comment_score': """SELECT COUNT(*) FROM comments_comment
            WHERE comments_comment.object_pk = yourapp_entry.id
            AND comments_comment.content_type = %s"""
    }, select_params=(entry_type,))

当然,您必须填写正确的表名。此外,entry_type是一个“常量”,可以在查找函数之外设置(参见ContentTypeManager):

from django.contrib.contenttypes.models import ContentType
entry_type = ContentType.objects.get_for_model(Entry)

这假设你有一个模型Entry,你想要计算你的分数。否则,事情会变得稍微复杂一些:你需要一个子查询来获取每个带注释对象类型的内容类型id。