[英]How to delete a User with particular email using 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,並分別對它們進行GET
, PUT
, POST
和DELETE
以檢索,更新,創建和刪除。
正如凱文斯通所提到的那樣,你使用的模式是不可取的,但是如果你想使用它,你需要修復你的網址中的拼寫錯誤以進行事件/刪除/映射。
# 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.