【问题标题】: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,这算两个还是一个?
  • 我只想比较帖子点赞数和评论点赞数。如果帖子喜欢

标签: python django django-models backend django-database


【解决方案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
)

之前,您需要使用.annotate(…) [Django-doc] 而不是.alias(…) [Django-doc]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2022-01-10
    • 2019-08-24
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多