Django QuerySet 注释 - 更有效的方法?

问题描述 投票:0回答:1

在基于类的 ListView 中,我想用评论数量注释每个帖子(此方法有效)

def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)


    context['approved_comments'] = Comment.objects.values('post_id').annotate(c_count=Count('post_id')).filter(approved=True)
    return context

在我的模板中,我执行以下操作(感觉效率很低)

{% for comment in approved_comments %}
    {% if post.id == comment.post_id %}
        {{comment.c_count}}
            
    {% endif %}
{% endfor %}

这让我得到了我想要的结果,但我正在努力寻找更好的方法来实现这一点,因为这看起来真的很多余。

我试图找到一个已经解决这个问题的问题,但还没有找到,所以如果你能指出我的链接会很有帮助。

提前致谢:)

django annotations django-class-based-views
1个回答
1
投票

这是二次 JOIN,你不应该这样做。您可以简单地在视图中用已批准评论的数量注释

Post

from django.db.models import Count, Q
from django.views.generic import ListView

class MyListView(ListView):
    model = Post
    queryset = Post.objects.annotate(
        napproved_comments=Count('comment', filter=Q(comment__approved=True))
    )

然后在模板中渲染它:

{{ post.napproved_comments }}
© www.soinside.com 2019 - 2024. All rights reserved.