Non_field_errors Ошибка "Данные не предоставлены" при запросе PUT
Я новичок в Django и python. Сейчас я пытаюсь сделать веб-API с помощью Django и python. Мои запросы GET, POST и DELETE работают, но PUT дает мне ошибку:
{ "non_field_errors": [ "Данные не предоставлены" ] }
(я использовал Postman)
Вот мой код:
Serializer:
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)
URLs приложений:
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/<int:pk>', TopicView.as_view())
]
тело запроса:
{
"title": "pipiska",
"text": "pipiska111"
}
это происходит из-за использования неправильных методов? (извините за ужасный английский)
Два изменения и PUT запрос будет работать нормально.
Один из них находится в файле serializers.py.
Вместо instance.description = validated_data.get('text', instance.description)
измените его на instance.text = validated_data.get('text', instance.text)
Еще один, как упоминалось в комментариях, в views.py в put definition используется data = request.data
вместо data = request.data.get('topic')
Затем дайте PUT запрос от Postman со следующим телом запроса:
{
"title": "pipiska",
"text": "pipiska111"
}
он будет работать нормально.