Как удалить объект с помощью Django Rest Framework
Я пытаюсь написать RESTful API для моего приложения планирования событий с помощью Django Rest Framework, но у меня возникли проблемы при использовании представлений, которые не ожидают получить HTTP-метод. Я прочитал учебник на сайте DRF. Из того, что я понимаю после прочтения учебника и документации по представлению на основе класса на сайте Django, является то, что если есть представление на основе класса, как это (взято из учебника DRF)
class SnippetDetail(APIView):
"""
Retrieve, update or delete a snippet instance.
"""
def get_object(self, pk):
try:
return Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet)
return Response(serializer.data)
def put(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet, data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
snippet = self.get_object(pk)
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
различные методы в представлении соответствуют различным методам HTTP-запросов. Так что если у меня есть www.foo.com/bar
он будет делать две разные вещи, основанные на том, какой метод запроса отправляется на этот адрес. Это означает, что мне не нужно указывать что-либо еще, потому что выполняемая функция определяется на основе метода, с которым отправляется URL-адрес. Правильно ли это?
у меня есть это представление, которое я попытался смоделировать после примера на сайте DRF
class EventDetail(APIView):
"""
Retrieve, update or delete a event instance.
"""
def get_object(self, pk):
try:
return Event.objects.get(pk=pk)
except Event.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
event = self.get_object(pk)
serializer = EventSerializer(event)
return Response(serializer.data)
def post(self, request, format=None):
serializer = EventSerializer(data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# def put(self, request, pk, format=None):
# event = self.get_object(pk)
# serializer = EventSerializer(event, data=request.DATA)
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
event = self.get_object(pk)
event.delete()
return Response(status=status.HTTP_204_NO_CONTENT
который сопоставляется с этими URL-адресами
urlpatterns = patterns('',
# Get event
url(r'^(?P<pk>d+)/$', views.EventDetail.as_view(),
name='create_events'),
# list all events
url(r'^list/$', views.EventList.as_view(),
name='list_events'),
# url(r'^update$/(?P<pk>d+)', #update event),
url(r'^create/$', views.EventDetail.as_view(),
name='create_events'),
# delete event
url(r'^delete$/(?P<pk>d+)',
views.EventDetail.as_view(), name='delete_event'),
)
который я пытаюсь проверить, используя CURL с этой командой (как предложено здесь удалить с помощью CURL с закодированным URL)
curl -X DELETE "http://127.0.0.1:8000/events/delete/1"
это, похоже, сделает то, что должно:
[18/Oct/2014 22:41:27] "DELETE /events/delete/1 HTTP/1.1" 404 2707
но фактическая запись не удаляется из базы данных
есть ли здесь что-то, что я забываю сделать, чтобы заставить их работать правильно?
2 ответов
вы излишни. Метод HTTP уже DELETE
, Так что нет /events/delete
в url. Попробуйте это:
curl -X DELETE "http://127.0.0.1:8000/events/1/"
по умолчанию маршрутизатор DRF создает подробные URL-адреса в /event/<pk>
и GET
, PUT
, POST
и DELETE
их для извлечения, обновления, создания и удаления соответственно.
как упоминал Кевин Стоун, шаблон, который вы используете, не рекомендуется, но если вы хотите его использовать, вам нужно будет исправить опечатку в ваших URL-адресах для события/удалить/ сопоставление.
# delete event
url(r'^delete$/(?P<pk>\d+)',
views.EventDetail.as_view(), name='delete_event'),
должно быть:
# delete event
url(r'^delete/(?P<pk>\d+)',
views.EventDetail.as_view(), name='delete_event'),