Показать пост, чей комментарий имеет больше лайков, чем сам пост
В 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
)
Перед django-3.2 необходимо использовать .annotate(…)
[Django-doc] вместо .alias(…)
[Django-doc].