Django получить QuerySet связанного объекта внутри аннотации

Мои модели

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

Что у меня есть

Обычно я использую этот код для того, чтобы мои объекты комментариев имели атрибут "voting" и упорядочивали их по этому атрибуту.

comments = models.Comment.objects.annotate(voting=Count("liked_users")-Count("disliked_users")).order_by("-voting")

Но когда я хочу запросить посты, я не могу добраться до их комментариев:

Что я хочу

Я хочу, чтобы мой QuerySet "posts" имел атрибут для каждого отдельного поста, называемый "best_3_comments". Который представляет собой QuerySet комментариев, упорядоченных по их voting's.

Могу ли я добиться этого, не запрашивая все комментарии при каждом запросе постов?

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.

Вернуться на верх