显示评论比帖子点赞数多的帖子

Posted

技术标签:

【中文标题】显示评论比帖子点赞数多的帖子【英文标题】:show post whose comment have more likes than the post 【发布时间】:2021-11-02 11:50:23 【问题描述】:

在 django 中,我想在主页上显示一些带有 1 或 2 个 cmets 的帖子。

我只想显示那些其 cmets 的点赞数多于帖子点赞数的帖子。

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

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

【问题讨论】:

所以你取了cmets之类的总和?平均值?如果用户喜欢一个帖子的两个 cmets,这算两个还是一个? 我只想比较帖子点赞数和评论点赞数。如果帖子喜欢 【参考方案1】:

我们可以使用注解来统计Post 及其 cmets 的点赞数:

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]。

【讨论】:

以上是关于显示评论比帖子点赞数多的帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 fql 的情况下获取帖子 URL 的 Facebook 点赞、分享和评论计数?

显示通知逻辑

redis应用场景

04: 层级评论

redis能做什么

MYSQL 查询 - 获取与帖子相关的最新评论