#python #django #django-rest-framework
Вопрос:
Я новичок в Django и python. Теперь я пытаюсь создать веб-API с помощью Django и python. Мои запросы на ПОЛУЧЕНИЕ, публикацию и УДАЛЕНИЕ работают, но PUT выдает мне ошибку:
{ «non_field_errors»: [ «Данные не предоставлены» ] }
(я использовал почтальона)
Вот мой код:
Сериализатор:
from rest_framework import serializers from .models import Topic class TopicSerializer(serializers.ModelSerializer): title = serializers.CharField(max_length=50) text = serializers.CharField(max_length=500) class Meta: model = Topic fields = [ 'title', 'text' ] def update(self, instance, validated_data): instance.title = validated_data.get('title', instance.title) instance.description = validated_data.get('text', instance.description) instance.save() return instance
Число просмотров:
from rest_framework.generics import get_object_or_404 from rest_framework.response import Response from rest_framework.views import APIView from .models import Topic from .serializers import TopicSerializer class TopicView(APIView): def get(self, request): topics = Topic.objects.all() serializer = TopicSerializer(topics, many=True) return Response({'topic': serializer.data}) def post(self, request): topic = request.data serializer = TopicSerializer(data=topic) if serializer.is_valid(raise_exception=True): topic_saved = serializer.save() return Response({'success': 'Topic {} created successfully'.format(topic_saved.title)}) def put(self, request, pk): # saved_topic = get_object_or_404(Topic.objects.all()) saved_topic = get_object_or_404(Topic.objects.filter(id=pk)) data = request.data.get('topic') serializer = TopicSerializer(instance=saved_topic, data=data, partial=True) if serializer.is_valid(raise_exception=True): topic_saved = serializer.save() return Response({ "success": "Topic '{}' updated successfully".format(topic_saved.title) }) def delete(self, request, pk): topic = get_object_or_404(Topic.objects.all(), pk=pk) topic.delete() return Response({ "message": "Topic with id `{}` has been deleted.".format(pk) }, status=204)
URL-адреса приложений:
from django.urls import path from .views import TopicView app_name = "rest_test_app" # app_name will help us do a reverse look-up latter. urlpatterns = [ path('topics/', TopicView.as_view()), path('topics/lt;int:pkgt;', TopicView.as_view()) ]
тело запроса:
{ "title": "pipiska", "text": "pipiska111" }
это из-за использования неправильных методов? (извините за ужасный английский)
Комментарии:
1. какой запрос вы отправляете? можете ли вы добавить это в вопрос?
2. я отправляю запрос на размещение
3. тело запроса ?
4. извини, забудь об этом
5. Вы должны перейти
request.data
к сериализатору, а неrequest.data.get('topic')
. Почему такая очередьdata = request.data.get('topic')
?
Ответ №1:
Два изменения и запрос на ввод будут работать нормально.
Один из них находится в serializers.py файл. Вместо instance.description = validated_data.get('text', instance.description)
того, чтобы изменить его на instance.text = validated_data.get('text', instance.text)
Еще один, как упоминалось в комментариях, в views.py в положенном определении используйте data = request.data
вместо data = request.data.get('topic')
Затем отправьте запрос от почтальона со следующим текстом запроса:
{ "title": "pipiska", "text": "pipiska111" }
это будет работать нормально.
Комментарии:
1. Спасибо за помощь, это сработало! это просто была моя неосторожность
2. С удовольствием. Счастливого кодирования.