django - 为什么 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."
解决方案
即使您没有明确提及,但从您的代码片段中很明显您正在使用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
-> 用于更新 IDDELETE /video/1
-> 用 ID 删除
欲了解更多信息:ModelViewSet
文档
推荐阅读
- visual-studio-code - vscode settings.json 按钮去哪了?
- javascript - 尽管 Angular 在本地工作正常,但在构建后不起作用
- oracle - 防止 Oracle 包在生产中执行
- python - Tkinter entry.get() 不更新 [Gurobi Python]
- appium - WebdriverIO+Appium中如何获取伪元素
- jquery - 将焦点移到另一个 div 中的下一个输入
- unity3d - 统一检查员何时分配变量?
- list - 将谓词中生成的所有列表添加到最后的一个大列表中
- julia - Julia 中的大矩阵幂
- authentication - 在 IIS 8.5 中,管理器 GUI 中是否有将 Location 和 Authentication 标记添加到 applicationHost.config 文件的设置?