【问题标题】:Filtering another model field count for each item from object_list (List View, Django)从 object_list 中过滤每个项目的另一个模型字段计数(列表视图,Django)
【发布时间】:2019-04-27 06:15:30
【问题描述】:

我正在学习 Django 尝试创建博客。我在主页上有一个 Post 模型的 ListView。我正在尝试添加新的上下文数据(来自 ListView 中每个项目的单独模型注释中的 cmets 数量)。但是,我无法使用 __in 正确过滤每个帖子的评论数量(它只显示 ListView 的每个帖子项目的评论总数相同)。您能否帮助我了解如何获得正确的过滤器以显示每个 ListView Post 项目有多少评论?

谢谢!

帖子模型:

class Post(models.Model):
    class Meta:
        verbose_name = 'запись'
        verbose_name_plural = 'записи'

    title = models.CharField('название', max_length=300, help_text='Не более 300 знаков')
    content = models.TextField('текст записи')
    date_posted = models.DateTimeField('дата публикации', default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='автор')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

评论模型:

class Comment(models.Model):
    class Meta:
        verbose_name = 'комментарий'
        verbose_name_plural = 'комментарии'

    content = models.CharField('текст комментария', max_length=500, help_text='Не более 500 знаков')
    date_posted = models.DateTimeField('дата публикации', default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name = 'автор')
    postid = models.ForeignKey(Post, on_delete=models.CASCADE)

views.py 中的列表视图:

class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 5

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.filter(postid__in = self.object_list)
        return context

我在 html 模板中使用的上下文数据:

{% for post in posts%}
 {{ post.content }}
 {{ comments.count }}
{% endfor %}

【问题讨论】:

    标签: django listview filtering


    【解决方案1】:

    您可能想要的是 .annotate(..) 查询集,这样每个 Post 对象都包含一个带有 cmets 数量的额外属性:

    from django.db.models import Count
    
    class PostListView(ListView):
        model = Post
        queryset = Post.objects.annotate(
            num_comments=Count('comment')
        )
        template_name = 'blog/home.html'
        context_object_name = 'posts'
        ordering = ['-date_posted']
        paginate_by = 5

    然后,您可以在模板中获取.num_comment 属性(这仅添加到源自this queryset 的Post 对象),并使用:

    {% for post in posts%}
       {{ post.content }}
       {{ post.num_comments }}
    {% endfor %}

    【讨论】:

    • 哇,谢谢。不知道这种方法。真的很好用!
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2018-05-07
    相关资源
    最近更新 更多