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"
}

он будет работать нормально.

Вернуться на верх