Получение общих значений в кверисете django

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

models.py

class QuestionDraft(models.Model):
    quiz_profile = models.ForeignKey(QuizProfile,
                                 on_delete=models.CASCADE,
                                 blank=True,
                                 null=True)
    question = models.ForeignKey(Question,
                             on_delete=models.CASCADE,
                             blank=True,
                             null=True)
    text = models.TextField()
    is_answered = models.BooleanField(blank=True, null=True)
    is_correct = models.BooleanField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Question(models.Model):
    id = models.CharField(max_length=7,
                      default=generate_question_id,
                      unique=True,
                      primary_key=True,
                      editable=False)
    question_subject = models.ForeignKey(
    QuestionSubject, on_delete=models.CASCADE)
    text = models.TextField()
    mark = models.IntegerField(default=1)
    is_published = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class QuestionSubject(models.Model):
    quiz_course = models.ForeignKey(QuizTheoryCourse, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    exam_questions_num = models.IntegerField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

В моих представлениях я пытаюсь сначала отфильтровать правильные ответы (которые я получаю правильно), а затем сгруппировать правильные ответы по предметам. Допустим, у меня есть 10 различных предметов

views.py

def test_report(request, pk):
    quiz_profile = QuizProfile.objects.get(id=pk)
    question_drafts = QuestionDraft.objects.filter(quiz_profile=quiz_profile)
    total_questions = question_drafts.count()
    right_answers = quiz_profile.right_answer
    quiz_percentage = ((right_answers * 100) / total_questions)
    wrong_answers = total_questions - quiz_profile.right_answer

    right_ans = QuestionDraft.objects.filter(
    quiz_profile=quiz_profile, is_correct=True)
    subjects = [
    question.question.question_subject for question in right_ans]
    right_ans_list = []
    for s in subjects:
        print(right_ans.filter(question__question_subject=s).count())

context = {
    'quiz_profile': quiz_profile,
    'total_questions': total_questions,
    'quiz_percentage': quiz_percentage,
    'wrong_answers': wrong_answers,
    'right_answers': right_answers,
    'subjects': subjects,
}
return render(request, 'quiz/test_report.html', context)

Я пробовал много разных способов, но не смог найти подходящий способ, как зациклить или отфильтровать еще больше.

Можете ли вы попробовать это? Это даст вам темы для конкретной викторины и количество вопросов, на которые были даны ответы.

questions = QuestionDraft.objects.filter(quiz_profile_id=quiz_profile, is_answered=True).annotate(que_count=Count('question__question_subject_id')).values("question__question_subject__name","que_count")
Вернуться на верх