Ниже представлен фрагмент api сервиса тестирования, пользователь отвечает на вопросы. По сути мне необходимо временно хранить ответы пользователя, пока он не пройдет весь тест, но при этом сразу же валидировать каждый ответ и выводить комментарий

Отправив 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
Ниже представлен фрагмент 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)