My Models
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
#Unnecessary
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_comments")
post = models.ForeignKey(Post, on_delete=models.CASCADE,related_name="post_comments")
liked_users = models.ManyToManyField(User, blank=True, related_name="liked_comments")
disliked_users = models.ManyToManyField(User, blank=True related_name="disliked_comments")
#Unnecessary
What I Have
通常,我使用这段代码使我的注释对象具有属性"voting
";并按属性排序。
comments = models.Comment.objects.filter(post=post).annotate(voting=Count("liked_users")-Count("disliked_users")).order_by("-voting")
但是当我想查询帖子时,我无法到达他们的评论:
我想要什么
我想要我的QuerySet "posts
";每个帖子都有一个属性,叫做"best_3_comments
"。这是一个由他们的voting
排序的评论的QuerySet。
每次查询帖子时,我可以在不查询所有评论的情况下实现这一点吗?
posts = models.Post.objects.annotate(
best_3_comments = get_query_of_the_posts_comments("post_comments").annotate(
voting=Count("liked_users")-Count("disliked_users")
).order_by("-voting")[:3]
)
我可以用什么函数来查询帖子的评论,我应该怎么做?我完全接受新的想法和方法来实现我想要的目标,我找不到哪个功能和如何使用它。
提前谢谢你。
我找到了一个解决方案。我想把它分享给那些将来寻找解决类似我的问题的方法的人。
posts = models.Post.objects.all() # The QuerySet You Want To Use
for post in posts:
post.best_3_comments = models.Comment.objects.filter(post=post).annotate(voting=Count("liked_users")-Count("disliked_users")).order_by("-voting")[:3]
解决方案是遍历QuerySet,为所有包含QuerySet的QuerySet分配一个属性。