我有一个显示我所有帖子的视图。帖子与ForeignKey
有comment
关系。我希望能够在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中显示帖子的评论总数没有问题。我在处理此查询时需要帮助
答案 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。