Django - Запрос сообщений вместе с количеством ответов?

Я пытаюсь заполнить ленту новостей сообщениями определенной категории. Затем я хочу иметь возможность отображать количество ответов на сообщение. Я запутался, как это сделать, потому что я отфильтровал цели по категориям, затем отфильтровал все посты, связанные со всеми этими целями, и теперь у меня есть список словаря, содержащий тело поста, описание цели и дату создания, но я хотел бы также добавить количество ответов, и я не уверен, как сделать это эффективным способом. Также я понимаю, что мой способ выполнения действий в view.py не идеален, поэтому любые предложения будут замечательными!

Model.py

class Post(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator_id")
    goal_id = models.ForeignKey(Goal, on_delete=models.CASCADE)
    body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
    hash_tags = models.ManyToManyField(HashTag)

class ReplyPost(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="reply")
    post_id = models.ForeignKey(Post, on_delete=models.CASCADE)
    body = models.CharField(max_length=250)

View.py

@api_view(['GET'])
def get_most_recent_posts_by_category(request, category, count):
    goals_list = list(Goal.objects.filter(category = category).values_list('uuid', flat=True))
    data = list(Post.objects.filter(goal_id__in=goals_list).order_by('created').values('body', 'goal_id__description', 'created'))
    data['goal_description'] = data['goal_id__description']
    data['post_body'] = data['body']
    del data['goal_description']
    del data['body']
    return JsonResponse(data, status=status.HTTP_200_OK)

Вы можете использовать Count('replypost') для добавления количества элементов:

from django.db.models import Count

data = list(
    Post.objects.filter(
        goal_id__in=goals_list
    ).order_by(
        'created'
    ).values(
        'body', 'goal_id__description', 'created', replies=Count('replypost')
    )
)
Вернуться на верх