簡體   English   中英

如何使用Django Rest Framework刪除對象

[英]How to delete an object using Django Rest Framework

我正在嘗試使用Django Rest Framework為我的事件規划應用程序編寫RESTful API,但是在使用不期望GET 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進行DELETE

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

但實際記錄不會從我的數據庫中刪除

這里有什么東西讓我忘記做這些以使其正常工作嗎?

你是多余的。 HTTP方法已經是DELETE ,因此url中沒有/events/delete 嘗試這個:

curl -X DELETE "http://127.0.0.1:8000/events/1/"

默認情況下,DRF的路由器在/event/<pk>創建詳細的URL,並分別對它們進行GETPUTPOSTDELETE以檢索,更新,創建和刪除。

正如凱文斯通所提到的那樣,你使用的模式是不可取的,但是如果你想使用它,你需要修復你的網址中的拼寫錯誤以進行事件/刪除/映射。

 # 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'),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM