non_field_errors "No data provided" PUT 请求错误

non_field_errors "No data provided" error on PUT request

我是 Django 和 python 的新手。现在我正在尝试用 Django 和 python 做网络 API。我的 GET、POST 和 DELETE 请求有效,但 PUT 给我错误:

{ "non_field_errors": [ "No data provided" ] }

(我用的是 Postman)

这是我的代码:

序列化器:

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)

应用网址:

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 in put definition use data = request.data instead of data = request.data.get('topic')

然后使用以下请求正文从 Postman 发出 PUT 请求:

{
"title": "pipiska",
"text": "pipiska111"
}

它将正常工作。