/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),

pkid