首页 > 解决方案 > 为什么 Django API Get 工作但 Post 不工作?

问题描述

我正在使用 Django 开发 API,GET 方法有效,但 post 方法给出“添加失败”。错误。

以下是模型,

class Video(models.Model):
    VideoId = models.AutoField(primary_key=True)
    VideoName = models.CharField(max_length=100)
    FPS = models.CharField(max_length=100)
    TotalFrame = models.CharField(max_length=100)
    Duration = models.CharField(max_length=100)

API,

@csrf_exempt
def videoApi(request, id=0):
    if request.method == 'GET':
        video = Video.objects.all()
        video_serializer = VideoSerializer(video, many=True)
        return JsonResponse(video_serializer.data, safe=False)

    elif request.method == 'POST':
        video_data = JSONParser().parse(request)
        video_serializer = VideoSerializer(data=video_data)
        if video_serializer.is_valid():
            video_serializer.save()
            return JsonResponse("Added Successfully!!", safe=False)
        return JsonResponse("Failed to Add.", safe=False)

    elif request.method == 'PUT':
        video_data = JSONParser().parse(request)
        video = Video.objects.get(VideoId=video_data['VideoId'])
        video_serializer = VideoSerializer(video, data=video_data)
        if video_serializer.is_valid():
            video_serializer.save()
            return JsonResponse("Updated Successfully!!", safe=False)
        return JsonResponse("Failed to Update.", safe=False)

    elif request.method == 'DELETE':
        video = Video.objects.get(VideoId=id)
        video.delete()
        return JsonResponse("Deleted Succeffully!!", safe=False)

网址

url(r'^video/$',views.videoApi),
    url(r'^video/([0-9]+)$',views.videoApi),

序列化器,

class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Video
        fields = '__all__'

JSON 输入

[{"VideoId": 2, "VideoName": "lol", "FPS": "1", "TotalFrame": "1", "Duration": "1"}]

输出 ,

"Failed to Add."

标签: djangoapi

解决方案


即使您没有明确提及,但从您的代码片段中很明显您正在使用django-rest-framework,所以这应该解决它:

from rest_framework.decorators import api_view, parser_classes
from rest_framework.parsers import JSONParser

@api_view(["POST", "GET", "DELETE", "PUT"])
@parser_classes([JSONParser,])
def videoApi(request)

   # ...snip...

    elif request.method == 'POST':
        video_serializer = VideoSerializer(data=request.data) # .data is important!!
        if video_serializer.is_valid():
            video_serializer.save()
            return JsonResponse("Added Successfully!!", safe=False)
        return JsonResponse("Failed to Add.", safe=False)

更好的是,Django-Rest-Framework 带有电池,因此对于您的用例,您可以简单地编写一个ModelViewSet. 例如,

from rest_framework.viewsets import ModelViewSet
    
class VideoViewSet(ModelViewSet):
    """
    A simple ViewSet for viewing and editing videos.
    """
    queryset = Video.objects.all()
    serializer_class = VideoSerializer

然后在你的urls.py

from rest_framework import routers
from .views import VideoViewSet

router = routers.DefaultRouter(trailing_slash=False)
router.register(r"video", VideoViewSet)

urlpatterns = [
    path("", include(router.urls)),
]

有了这个,您可以执行以下操作:

  • GET /video- 对于列表
  • GET /video/1-> 用于使用 ID 检索
  • POST /video-> 用于创作
  • PUT /video/1-> 用于更新 ID
  • DELETE /video/1-> 用 ID 删除

欲了解更多信息:ModelViewSet文档


推荐阅读