TypeError at /pet/3/ petAPI() got an unexpected keyword argument 'pk' Django
Я новичок в Django и его REST Framework, я пытаюсь разработать 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 следующим образом:
Простите мое невежество, есть ли у кого-нибудь идеи, почему он принимает метод DELETE за GET и не позволяет мне удалить запись из базы данных?
Имя параметра URL - pk
, а не id
. Действительно, если мы посмотрим на шаблон пути, то увидим:
urlpatterns = [
path('pet/<int:pk>/', views.petView.petAPI),
]
Таким образом, вам следует изменить подпись на:
@csrf_exempt
def petAPI(request, pk=0):
# …
и использовать pk
вместо id
в функции.
измените значение в url.py
path('pet/<int:id>/', views.petView.petAPI),
от pk
к id