Как удалить объект с помощью 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'),