Как я могу получить список значений словаря в качестве вывода, используя 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?

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