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"
}
它将正常工作。
我是 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"
}
它将正常工作。