Фильтрация в запросе annotate () - PullRequest
2 голосов
/ 23 января 2012

Я создаю приложение django с комментариями и голосую за эти комментарии в стиле stackoverflow или reddit.При выборе комментариев я хотел бы узнать как общее количество голосов, так и то, проголосовал ли пользователь по данному конкретному комментарию.Я могу использовать аннотацию для совокупного количества следующим образом:

video_comments = Comment.objects.filter(video_id=video_id).annotate(vote_sum=Sum('commentvote__value'))

Могу ли я также аннотировать подмножество комментариев?Что-то вроде:

.annotate(user_vote=Sum('commentvote__value').filter(commentvote__user == user))

Для справки, это моя модель:

class Comment(models.Model):
    video_id = models.CharField(max_length=12, db_index=True)
    video_time = models.FloatField()

    comment = models.TextField(max_length=MAX_COMMENT_LENGTH)

    datetime = models.DateTimeField(auto_now_add = True)
    user = models.ForeignKey(User)

class CommentVote(models.Model):
    comment = models.ForeignKey(Comment, db_index=True)
    value = models.IntegerField() # Should be 1 or -1

    datetime = models.DateTimeField(auto_now_add = True)
    user = models.ForeignKey(User, db_index=True)

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Согласно this , вы можете фильтровать по заданному полю перед аннотированием:

Comment.objects.filter(video_id=video_id).filter(commentvote__user=user))\
               .annotate(user_vote=Sum('commentvote__value'))

К сожалению, это сужает набор комментариев только к тем комментариям, которые имеют голоса, поданныеданный пользователь.Но вы также можете получить оставшиеся комментарии:

Comment.objects.filter(video_id=video_id).exclude(commentvote__user=user))

и объединить оба списка вручную.

0 голосов
/ 23 января 2012

Я думаю, что это должно дать вам то, что вам нужно:

CommentVote.objects.values('comment').filter(comment__video_id=video_id,user=user).annotate(vote_sum=Sum('value')).values_list('comment','vote_sum',)
...