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