Django 注释 - 更有效的方法?
Django Annotations - More efficient way?
在基于 class 的 ListView 中,我想用注释数量注释每个 Post(此方法有效)
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 %}
这让我得到了我想要的结果,但我正在努力寻找一种更好的方法来实现它,因为这看起来真的是多余的。
我试图找到一个已经解决这个问题的 SO 问题,但没有找到,所以如果你能指出 link 会有帮助。
提前致谢:)
这是一个二次 JOIN,你不应该这样做。您可以简单地用视图中已批准评论的数量来注释 Post
s:
from django.db.models import Count, Q
from django.views.generic import ListView
class MyListView(ListView):
model = Post
queryset = Post.objects.annotate(
<b>napproved_comments=Count('comment', filter=Q(comment__approved=True))</b>
)
然后在模板中渲染:
{{ post<b>.napproved_comments</b> }}
在基于 class 的 ListView 中,我想用注释数量注释每个 Post(此方法有效)
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 %}
这让我得到了我想要的结果,但我正在努力寻找一种更好的方法来实现它,因为这看起来真的是多余的。
我试图找到一个已经解决这个问题的 SO 问题,但没有找到,所以如果你能指出 link 会有帮助。
提前致谢:)
这是一个二次 JOIN,你不应该这样做。您可以简单地用视图中已批准评论的数量来注释 Post
s:
from django.db.models import Count, Q
from django.views.generic import ListView
class MyListView(ListView):
model = Post
queryset = Post.objects.annotate(
<b>napproved_comments=Count('comment', filter=Q(comment__approved=True))</b>
)
然后在模板中渲染:
{{ post<b>.napproved_comments</b> }}