Как я могу получить список значений словаря в качестве вывода, используя annotate в Django?
Пока я работаю над созданием API вопросов и ответов по категориям. У меня получается подсчитывать количество пользователей, выбравших различные варианты.
Теперь я застрял на получении данных пользователя, который выбрал этот вариант. Я могу добиться этого, используя цикл for на данных опций и получить все данные пользователя. Но число запросов, генерируемых для этого метода, огромно по количеству.
Есть ли способ сделать это с помощью annotate?
models.py
class Question(models.Model):
institute = models.ForeignKey('Institute', on_delete=models.CASCADE,
related_name='questions', null=True, blank=True)
question = models.TextField()
category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True,
blank=True, related_name='questions')
subject = models.ForeignKey('TrnSchoolSubject', on_delete=models.CASCADE, null=True,
blank=True, related_name='questions')
for_institute = models.BooleanField(default=True)
difficulty = models.ForeignKey(Difficulty, on_delete=models.CASCADE,
null=True, blank=True)
is_active = models.BooleanField(default=True)
is_survey = models.BooleanField(default=False)
**Question options**
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
text = models.TextField(null=True, blank=True)
is_correct = models.BooleanField(default=False)
sequence = models.IntegerField(default=0)
class AnswerTracking(models.Model):
student = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
related_name="answer_tracking")
category = models.ForeignKey('Category', on_delete=models.CASCADE,
related_name="question_category")
question = models.ForeignKey(Question, on_delete=models.CASCADE,
related_name="tracking_question")
student_answer = models.ForeignKey(Answer, on_delete=models.CASCADE, null=True,
related_name="student_answer")
answer = models.ForeignKey(Answer, on_delete=models.CASCADE,
related_name="correct_answer")
views.py
@api_view(["GET"])
def admin_faq_category(request, category_id):
questions = (Question.objects
.prefetch_related("answers")
.annotate(total_users=Count("tracking_question"))
.filter(is_active=True, for_institute=True,
category_id=category_id, institute=request.user.institute
)
.values("id", "question", "is_active", "for_institute", "is_survey",
"marks", "negative_marks", "total_users")
.order_by("id")
)
for question in questions:
answers = (Answer.objects.filter(question__id=question["id"])
.prefetch_related("student_answer")
.annotate(vote=Count("student_answer"),
vote_percent=ExpressionWrapper(
Count("student_answer")*100/question["total_users"],
output_field=DecimalField(decimal_places=2))
)
.values()
)
for answer in answers:
users = (AnswerTracking.objects
.filter(student_answer=answer["id"])
.values("student__id", "student__first_name",
"student__last_name")
)
answer["students"] = users
question["answers"] = answers
return Response(questions)
Как я могу получить информацию о пользователе в списке словарей, который выбрал этот вариант без цикла for в запросе answers?