почему я получаю эту ошибку KeyError в /evaluationtest/? ‘запрос’

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

привет, я создал Crud-функцию для оценочного теста, но я получаю keyerror ‘request’, такой странный для меня, я не видел эту ошибку раньше, я новичок в django, может кто-нибудь помочь мне это исправить?

 def validate(self, data, *args, **kwargs):
        questions = self.context['request'].data.get("questions")
        if not questions:
            raise serializers.ValidationError("questions are required")
            if self.context["request"].method == "POST":
                self.questions = QuestionSerializer(data=questions, many=True)
                self.questions.is_valid(raise_exception=True)
            elif self.context["request"].method == "PUT":
                self.questions = questions
                self.new_questions = self.context["request"].data.get(
                    "new_questions")
                if self.new_questions:
                    self.new_questions = QuestionSerializer(
                        data=self.new_questions, many=True)
                    self.new_questions.is_valid(raise_exception=True)
            return data

    def create(self, data):
        evaluation_test = EvaluationTest()
        evaluation_test.category = data['category']
        evaluation_test.admin = data['admin']
        evaluation_test.title = data['title']
        evaluation_test.type = data['type']
        evaluation_test.save()

        for question in data['questions']:
            question.evaluationtest = evaluation_test
            question.save()
        return evaluation_test

    def update(self, instance, validated_data):
        instance.title = validated_data.get["title", instance.title]
        instance.type = validated_data.get["type", instance.type]
        instance.category = validated_data.get["category", instance.category]
        instance.admin = validated_data.get["admin", instance.admin]

        for question in self.questions:
            q = QuestionSerializer(instance=question["id"], data=question)
            q.is_valid(raise_exception=True)
            q.save()

        if self.new_questions:
            new_questions = self.new_questions.save()
            for question in new_questions:
                question.save()
        return instance
  

число просмотров.py
Вот мой view.py код, когда я реализую все приложение crud, вы можете увидеть, и, пожалуйста, дайте мне, как я могу изменить, чтобы заставить его работать

 class EvaluationTestViewSet(viewsets.ModelViewSet):

permission_classes = (IsAuthenticated, )
serializer_class = EvaluationTestSerializer
queryset = EvaluationTest.objects.all()

@action(methods=['get'], detail=False, url_path='by-category/(?P<category_id>d )', url_name='by_category')
def by_category(self, request, *args, **kwargs):
    evaluationtest = EvaluationTestSerializer.by_category(
        kwargs['category_id'])
    if evaluationtest:
        return Response(evaluationtest)
    return Response(status=HTTP_404_NOT_FOUND)

def create(self, request):
    serializer = EvaluationTestSerializer(data=request.data)
    if serializer.is_valid():
        evaluationtest = serializer.create(request)
        print(evaluationtest)
        if evaluationtest:
            return Response(status=HTTP_201_CREATED)
    return Response(status=HTTP_400_BAD_REQUEST)
  

Комментарии:

1. можете ли вы показать свой код просмотра?

2. @JPG я также добавил код просмотра

Ответ №1:

вы должны задать запрос в контексте сериализатора.

измените свой метод создания:

 def create(self, request):
    serializer = EvaluationTestSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():
        # call save() instead of create
        evaluationtest = serializer.save()
        print(evaluationtest)
        # ideally you should also return serializer.data
        return Response(status=HTTP_201_CREATED)
    # ideally you should also return serializer.errors
    return Response(status=HTTP_400_BAD_REQUEST)
  

Комментарии:

1. serializer_class=self.__class__.__name__ Ошибка утверждения: в Class ChoiceSerializer отсутствует атрибут «Meta.model»

2. Является ли ваш serilizer «ModelSerializer»? Возможно, вам не хватает class Meta внутренней части, где вы должны указать model=... и fields=[...]

3. для вопроса в data[«вопросы»]: KeyError: ‘вопросы’