Как последовательно отвечать на вопросы в тесте?

Ниже представлен фрагмент api сервиса тестирования, пользователь отвечает на вопросы.

postman post запрос на создание Test_Result

Отправив post запрос с нужными параметрами по маршруту api/edu_service/test-result/create/ я могу создать результат решения теста ну то есть отправить ответы на вопросы теста, как сделать возможным отвечать не на все вопросы сразу, а последовательно, при этом валидировать каждый ответ и выводить комментарий в response ? Погуглив пока напрашивается решение создания еще одной модели в БД (допустим UserAnswer) которая будет хранить ответ на каждый конкретный вопрос, тогда вопрос как на их основе создать объект Test_Result. И как дополнить стандартный response своим комментарием ?

Есть модель результат теста (Test_Result), которая состоит из следующих полей:

class Test_Result(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    result = models.CharField(verbose_name='Результат', max_length=300)

    class Meta:
        verbose_name = 'Результат'
        verbose_name_plural = 'Результаты'
        ordering = ['id']

    def __str__(self):
        return self.user.username

Есть сериализатор который вычисляет значение поля result при создании объекта. По ключу username передаётся имя пользователя, по ключу testId - id теста в БД, по ключу answers передаются ответы пользователя на вопросы теста - ответы на все вопросы передаются единоразово то есть все вместе. Как сделать возможным отвечать последовательно на каждый вопрос т.е. дописывать значения в поле answers, при этом нужно проверять является ли ответ верным и выводить комментарий если не верно.

class TestResultSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField(many=False)

    class Meta:
        model = Test_Result
        fields = ('__all__')

    def create(self, request):
        data = request.data
        print(data)

        test = Test.objects.get(id=data['testId'])
        user = User.objects.get(username=data['username'])

        test_result = Test_Result()
        test_result.test = test
        test_result.user = user

        questions = [q for q in test.questions.all()]
        answers = [data['answers'][a] for a in range(len(data['answers']))]

        answered_correct_count = 0
        for i in range(len(questions)):
            answers_for_question = questions[i].answers.all()
            num_right = questions[i].num_right
            right_answer = []
            if num_right == len([answers[i]]):
                for j in answers_for_question:
                    if j.right:
                        right_answer.append(j)
                if right_answer.sort() == [answers[i]].sort():
                    answered_correct_count += 1

        result = answered_correct_count / len(questions) * 100
        test_result.result = str(result)
        test_result.save()
        return test_result

Вот представление которое связывает сериализатор с моделью

class TestResultsCreateView(CreateAPIView):
    serializer_class = TestResultSerializer
    queryset = Test_Result.objects.all()
    permission_classes = [IsAuthenticated]

    def post(self, request, *args, **kwargs):
        print(request.data)
        serializer = TestResultSerializer(data=request.data)
        serializer.is_valid()
        test_result = serializer.create(request)
        if test_result:
            return Response(status=HTTP_201_CREATED)
        return Response(status=HTTP_400_BAD_REQUEST)

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