在Django中向查询集添加注释数

时间:2012-08-03 16:52:45

标签: python django comments

我想在Django中显示帖子以及评论数量。我目前在帖子模型中没有帖子的评论数量,我以为我能够编写某种模型函数来显示帖子有多少评论,而不会像comment_count那样在模型中。

这是我的帖子模型:

class Post(models.Model):
    user = models.ForeignKey(User, unique=False)
    headline = models.CharField(max_length=400, verbose_name="post headline")
    type = models.CharField(max_length=4)
    branch = models.ForeignKey(Branch, verbose_name="branch name", validators=[branch_exists])
    upvotes = models.IntegerField()
    is_starred = models.BooleanField()
    url_title = models.SlugField()
    creation = models.DateTimeField()
    thumbnail = models.URLField(blank=True)
    body = models.TextField(max_length=90000, blank=False)
    link = models.URLField(blank=False, verbose_name="your link URL")

    def __unicode__(self):
        return u"`%s' posted by %s at %s\n" % (self.headline, self.user, self.creation)

这是我的评论模型:

class Comment(models.Model):
    user = models.ForeignKey(User, unique="False")
    time = models.DateTimeField()
    upvotes = models.IntegerField()
    post = models.ForeignKey(Post, unique="False")
    formatting = models.BooleanField(verbose_name="Format comment?")
    text = models.TextField(max_length=9000, blank=False)
    anonymous = models.BooleanField(verbose_name="Post comment anonymously?")

我想做类似的事情:

def __unicode__(self):
    return u"`%s' posted by %s at %s with %s comments" % (self.headline, self.user, self.creation, self.comment_count)

但没有comment_count字段;我希望从数据库中提取评论的数量以及帖子。

2 个答案:

答案 0 :(得分:4)

Annotations ......显然是Django最保密的秘密:

from django.db.models import Count
Post.objects.annotate(comment_count=Count('comment'))

然后,每个实例都有一个comment_count属性,您可以使用。

答案 1 :(得分:1)

您可以使用comment_set属性访问与帖子相关联的评论(如果您在related_name模型上的post ForeignKey上设置了Comment,则这是默认设置,你可以把它变成别的东西)。要只检索计数,请使用self.comment_set.count()

Django文档在Following relationships backward下面有一节。