Soy novato en Django y su REST Framework, estoy tratando de diseñar una API que me permita realizar las operaciones básicas del CRUD, tanto los métodos GET, POSt y PUT funcionan correctamente, sin embargo cuando trato de implementar el método DELETE Me sale un error muy particular:
Este es mi archivo principal 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), ]Este es mi archivo 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)Y estoy tratando de probar el método de eliminación de esta manera:
Disculpe mi ignorancia, ¿alguien tiene idea de por qué toma el método DELETE como GET y no me permite eliminar un registro de la base de datos?
El nombre del parámetro de URL es pk , no id . De hecho, si observamos el patrón de ruta, vemos:
urlpatterns = [ path('pet/<int: pk >/', views.petView.petAPI), ]Por lo tanto, debe cambiar la firma a:
@csrf_exempt def petAPI(request , pk=0 ): # … y use pk en lugar de id en la función.
cambiar el valor en url.py
path('pet/<int:id>/', views.petView.petAPI), de pk a id