Получение общих значений в кверисете 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")