Группировка по пользователям в django ORM

У меня есть модель StudentAnswer, которая хранит идентификатор ответа, данный студентом (пользователем) в тесте. Если ответ правильный, то ставится 1 оценка, в противном случае 0. Я также ранжирую пользователей на основе их оценок в конкретном тесте. Модель выглядит следующим образом:

class StudentAnswer(models.Model):
user = models.ForeignKey(User, related_name='user_question_answer', 
            on_delete=models.SET_NULL,null=True, blank=True)
answer = models.ForeignKey(QuizQuestionAnswer, related_name='user_answer', 
            on_delete=models.CASCADE)
quiz = models.ForeingKey(Quiz, on_delete=models.CASCADE)
marks = models.IntegerField()

Вот запрос, который я использую для ранжирования моих пользователей:

StudentAnswer.objects.filter(
        quiz__start_date__month=date.today().month).annotate(
        rank=Window(expression=DenseRank(), order_by=[F('marks').desc(),])
    )

У пользователя будет несколько записей в таблице (количество вопросов, которые он попытался ответить за месяц). Я хочу сгруппировать по каждому пользователю, добавить их оценки и затем ранжировать их за этот конкретный месяц и отправить ответ. Как я могу это сделать?

Заранее спасибо.

Вы можете упорядочить User по сумме marks в обратном порядке, так:

from django.db.models import Sum
from django.utils.timezone import now

User.objects.filter(
    user_question_answer__quiz__start_date__month=now().month
).annotate(
    total_marks=Sum('user_question_answer__marks')
).order_by('-total_marks')

или для конкретного Quiz:

from django.db.models import Sum

User.objects.filter(
    user_question_answer__quiz_id=quiz_id
).annotate(
    total_marks=Sum('user_question_answer__marks')
).order_by('-total_marks')

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

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