/pet/3/ petAPI() 的类型错误得到了一个意外的关键字参数 'pk' Django
TypeError at /pet/3/ petAPI() got an unexpected keyword argument 'pk' Django
我是 Django 及其 REST 框架的新手,我正在尝试设计一个 API 来执行 CRUD 的基本操作,包括 GET、POSt 和 PUT方法工作正常,但是当我尝试实现 DELETE 方法时,出现一个非常特殊的错误:
这是我的主要 urls.py 文件:
from django.conf.urls import url
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView, TokenRefreshView)
from pethomeApp import views
urlpatterns = [
path('login/', TokenObtainPairView.as_view()),
path('refresh/', TokenRefreshView.as_view()),
path('user/', views.UserCreateView.as_view()),
path('pet/', views.petView.petAPI),
path('pet/<int:pk>/', views.petView.petAPI),
]
这是我的 petViwe.py 文件:
from rest_framework import status, views
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from django.http.response import JsonResponse
from pethomeApp.models import Pet
from pethomeApp.serializers import PetSerializer
# Create your views here.
@csrf_exempt
def petAPI(request, id=0):
if request.method == 'GET':
if id == 0:
pets = Pet.objects.all()
serializer = PetSerializer(pets, many=True)
return JsonResponse(serializer.data, safe=False)
else:
pet = Pet.objects.get(id=id)
serializer = PetSerializer(pet)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = PetSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse("Added successfuly", safe=False)
return JsonResponse("Failed to add", safe=False)
elif request.method == 'PUT':
data = JSONParser().parse(request)
pet = Pet.objects.get(id_pet=data['id_pet'])
serializer = PetSerializer(pet, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse("Update successfuly", safe=False)
return JsonResponse("Failed to update")
elif request.method == 'DELETE':
pet = Pet.objects.get(id_pet=id)
pet.delete()
return JsonResponse("Deleted successfuly", safe=False)
我正在尝试像这样测试删除方法:
请原谅我的无知,有谁知道为什么它把 DELETE 方法当作 GET 而不允许我从数据库中删除一条记录?
URL参数的名称是pk
,不是id
。事实上,如果我们查看路径模式,我们会看到:
urlpatterns = [
path('pet/<int:<strong>pk</strong>>/', views.petView.petAPI),
]
因此您应该将签名更改为:
@csrf_exempt
def petAPI(request<strong>, pk=0</strong>):
# …
并在函数中使用 pk
而不是 id
。
更改 url.py
中的值
path('pet/<int:id>/', views.petView.petAPI),
从 pk
到 id
我是 Django 及其 REST 框架的新手,我正在尝试设计一个 API 来执行 CRUD 的基本操作,包括 GET、POSt 和 PUT方法工作正常,但是当我尝试实现 DELETE 方法时,出现一个非常特殊的错误:
这是我的主要 urls.py 文件:
from django.conf.urls import url
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView, TokenRefreshView)
from pethomeApp import views
urlpatterns = [
path('login/', TokenObtainPairView.as_view()),
path('refresh/', TokenRefreshView.as_view()),
path('user/', views.UserCreateView.as_view()),
path('pet/', views.petView.petAPI),
path('pet/<int:pk>/', views.petView.petAPI),
]
这是我的 petViwe.py 文件:
from rest_framework import status, views
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from django.http.response import JsonResponse
from pethomeApp.models import Pet
from pethomeApp.serializers import PetSerializer
# Create your views here.
@csrf_exempt
def petAPI(request, id=0):
if request.method == 'GET':
if id == 0:
pets = Pet.objects.all()
serializer = PetSerializer(pets, many=True)
return JsonResponse(serializer.data, safe=False)
else:
pet = Pet.objects.get(id=id)
serializer = PetSerializer(pet)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = PetSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse("Added successfuly", safe=False)
return JsonResponse("Failed to add", safe=False)
elif request.method == 'PUT':
data = JSONParser().parse(request)
pet = Pet.objects.get(id_pet=data['id_pet'])
serializer = PetSerializer(pet, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse("Update successfuly", safe=False)
return JsonResponse("Failed to update")
elif request.method == 'DELETE':
pet = Pet.objects.get(id_pet=id)
pet.delete()
return JsonResponse("Deleted successfuly", safe=False)
我正在尝试像这样测试删除方法:
请原谅我的无知,有谁知道为什么它把 DELETE 方法当作 GET 而不允许我从数据库中删除一条记录?
URL参数的名称是pk
,不是id
。事实上,如果我们查看路径模式,我们会看到:
urlpatterns = [
path('pet/<int:<strong>pk</strong>>/', views.petView.petAPI),
]
因此您应该将签名更改为:
@csrf_exempt
def petAPI(request<strong>, pk=0</strong>):
# …
并在函数中使用 pk
而不是 id
。
更改 url.py
中的值path('pet/<int:id>/', views.petView.petAPI),
从 pk
到 id