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.