Задать вопрос
Seletach
@Seletach
Начинающий бекендер

Как посчитать количество комментариев под постом с помощью annotate()?

В БД существует 2 модели, Commets и Post, из Comments в Post проложен ForeignKey.
class Comments(models.Model):
    text = models.TextField('')
    post = models.ForeignKey(
        Post,
        on_delete=models.CASCADE,
        related_name='comments'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        ordering = ('created_at',)

Как мне с помощью ForeignKey посчитать количество комментариев к определённому посту в коде ниже (в ключе контекста comment_count)?
class PostListView(ListView):
    '''Список постов'''
    model = Post
    template_name = 'blog/index.html'
    ordering = 'pub_date'
    paginate_by = 10

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comment_count'] = Comments.objects.annotate(comment_count=count())
        return context
  • Вопрос задан
  • 149 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Seletach
@Seletach Автор вопроса
Начинающий бекендер
Вот решение этой задачи:
class PostListView(ListView):
'''Список постов'''
    model = Post
    template_name = 'blog/index.html'
    ordering = 'pub_date'
    paginate_by = 10

    def get_queryset(self):
        return super().get_queryset().filter(
            category__is_published=True,
            is_published=True,
            pub_date__lte = timezone.now()
            ).annotate(comment_count=Count("comments"))

С помощью get_queryset достаём из модели Post все посты, далее фильтруем посты (посты и их категория должны быть опубликованы) и добавляем аннотацию, которая считает комментарии в этих постах.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
https://docs.djangoproject.com/en/5.0/topics/db/ag... ну и annotate с comment_count делается к Post, в твоем случае вообще лучше annotate добавить в get_queryset
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы