0
votes

I am trying to update the nested serializer in it but, it saying queryset has no attribute, this is the code below , please help out.

Traceback

Traceback (most recent call last): File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\django\views\generic\base.py", line 84, in view return self.dispatch(request, *args, **kwargs) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch response = self.handle_exception(exc) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\quiz\views.py", line 39, in put serializer.save() File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\venv\lib\site-packages\rest_framework\serializers.py", line 207, in save self.instance = self.update(self.instance, validated_data) File "C:\Users\HP\Desktop\roy\project\HelpMe\sunny\backend\quiz\serializers.py", line 47, in update answer = instance.answer.all() AttributeError: 'QuerySet' object has no attribute 'answer' [12/Jun/2022 19:13:39] "PUT /quiz/q/django/1/ HTTP/1.1" 500 108967

Views.py

class QuizQuestionDetail(APIView):

    def get(self, request, format=None, **kwargs):
        quizz = Question.objects.filter(id=kwargs['pk'])
        serializer = QuestionSerializer(quizz, many=True)
        return Response(serializer.data)

    def put(self, request, format=None, **kwargs):
        quizz = Question.objects.filter(id=kwargs['pk'])
        serializer = QuestionSerializer(quizz, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Serializer.py

class AnswerSerializer(serializers.ModelSerializer):

    class Meta:
        
        model = Answer
        fields = [
            'id',
            'answer_text',
            'is_right',
        ]

class QuestionSerializer(serializers.ModelSerializer):

    answer = AnswerSerializer(many=True)

    class Meta:
        model = Question
        fields = ['id','quiz', 'title','answer', ]

    def create(self, validated_data):
        answers_data = validated_data.pop('answer')
        question = Question.objects.create(**validated_data)
        for answer_data in answers_data:
            Answer.objects.create(question=question, **answer_data)
        return question

    def update(self, instance, validated_data):
        answers_data = validated_data.pop('answer')
        answer = instance.answer.all()
        answers = list(answer)
        instance.quiz = validated_data.get('quiz', instance.quiz)
        instance.title = validated_data.get('title', instance.title)
        instance.save()

        for answer_data in answers_data:
            answer = answers.objects.get(pk=answer_data['id'])
            answer.answer_text = answer_data.get('answer_text', answer.answer_text)
            answer.is_right = answer_data.get('is_right', answer.is_right)
            answer.save()
        return instance
1
Please add the full traceback to your questionIain Shelvington
I have done thatEfe Roy
Can you add the code for the models here?David Lu

1 Answers

0
votes

serializer = QuestionSerializer(quizz, data=request.data) you are passing queryset without setting many=True

filter method return a queryset even if it has a single object, to pass a queryset to serializer you need to set many attribute

serializer = QuestionSerializer(quizz, data=request.data, many=True)

But you still will get an error so don't use filter and use get method or get_object_or_404 You can't update a queryset just a single object