#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: ‘вопросы’