显示评论比帖子点赞数多的帖子
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]。
【讨论】:
以上是关于显示评论比帖子点赞数多的帖子的主要内容,如果未能解决你的问题,请参考以下文章