显示列表视图中与每个对象相关的注释总数

时间:2018-05-16 08:15:14

标签: python django

我有一个显示我所有帖子的视图。帖子与ForeignKeycomment关系。我希望能够在comments中显示与每个帖子相关的Listview总数。与Facebook上的反馈一样,您可以在用户活动供稿的每个帖子上看到comments的总数。

模型。吡啶

class Post(models.Model):
   name=models.CharField(max_length=230,null=True)
   text=models.TextArea(null=True)


class Comments(models.Model):
   comment=models.TextArea(null=True)
   post=models.ForeignKey(Post,related_name="post",null=True,on_delete=model.CASCADE)

View.py

def PostListView(request):
#getting  all post objects 
    allpost=Post.objects.all()
#getting all comments 
    allcomments=Comments.objects.all()
    template_name="post.html"
    context={'allpost':allpost,'allcomments':allcomments}
    return render(request,template_name,context)

 def PostDetail(request,slug):
     postinstance=get_object_or_404(Post,slug)
     #getting comments for this post
     comments_for_post=Comments.objects.all().filter(post=postinstance)
     #get the total count for comments for post
     commentcount=comments_for_post.count()

Listview我希望能够显示每个comments相关的post总数。在Listview模板中,我想要这样的内容:

{% for post in allpost %}
    {{post.name}}
    #get total number of comments for each post
    {{commentcount}}
{% endfor %}

注意我在DetailView中显示帖子的评论总数没有问题。我在处理此查询时需要帮助

3 个答案:

答案 0 :(得分:1)

您应该在帖子查询中使用注释。

from django.db.models import Count
allpost = Post.objects.all().annotate(commentcount=Count('post'))

现在,您可以在模板中执行{{ post.commentcount }}

注意,FK to Post上的related_name没有任何意义,从帖子到评论的related_name点应该被称为comments。更好的是,将其保留为默认值,即comment_set

答案 1 :(得分:0)

你需要的是“group by”SQL等价物。

   post=models.ForeignKey(Post,related_name="post",null=True,on_delete=model.CASCADE)

顺便说一句,在你的Comment类中,约定是代码:

{{1}}

而不是:

{{1}}

答案 2 :(得分:-1)

您不必编写任何查询集。这可以在您的模板中实现:

# for big numbers
{% load humanize %}

{% for post in allpost %}
    {{post.name}}
    #get total number of comments for each post
    {{post.post.count|intword}}
{% endfor %}

=======

可选但建议: 更改注释模型中的related_name:

class Comments(models.Model):
   comment=models.TextArea(null=True)
   post=models.ForeignKey(Post,related_name="comments",null=True,on_delete=model.CASCADE)

然后在模板中:

# for big numbers
{% load humanize %}

{% for post in allpost %}
    {{post.name}}
    #get total number of comments for each post
    {{post.comments.count|intword}}
{% endfor %}

编辑:要格式化大数字,请将'django.contrib.humanize'添加到您的INSTALLED_APPS。