Показать пост, чей комментарий имеет больше лайков, чем сам пост

В django я хочу показать несколько постов на главной странице с 1 или 2 комментариями.

Я хочу, чтобы показывались только те сообщения, чьи комментарии имеют больше лайков, чем лайков самого сообщения.

class Post:
    ...
    likes = models.ManyToManyField(User,...)
    ...

class Comment:
    ...
    post = models.ForeignKey(Post,...)
    likes = models.ManyToManyField(User,...)
    ...

Мы можем работать с аннотацией для подсчета количества лайков Post и комментариев к ней:

from django.db.models import Count, OuterRef, Subquery

comment_likes = Comment.likes.through.objects.filter(
    comment__post=OuterRef('pk')
).order_by().values('comment__post').annotate(
    c=Count('pk')
).values('c')

Post.objects.alias(
    num_likes=Count('likes')
).filter(
    num_likes__lt=Subquery(comment_likes)
)

В результате будет получен запрос, который выглядит следующим образом:

SELECT post.id
FROM post LEFT
OUTER JOIN post_likes ON post.id = post_likes.post_id
GROUP BY post.id HAVING COUNT(post_likes.customuser_id) < (
    SELECT COUNT(U0.id) AS c
    FROM comment_likes U0
    INNER JOIN comment U1 ON U0.comment_id = U1.id
    WHERE U1.post_id = post.id
    GROUP BY U1.post_id
)

Перед необходимо использовать .annotate(…) [Django-doc] вместо .alias(…) [Django-doc].

Вернуться на верх