Python 如何使用 Django Rest Framework 删除对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26445450/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to delete an object using Django Rest Framework
提问by user3282276
I am trying to write an RESTful API for my event planning app using Django Rest Framework but I am having some trouble when using views that do not expect the GET HTTP method. I have read through the tutorial on the DRF site. From what I understand after reading through the tutorial and the class based view documentation on the Django site is that if there is a class based view like this (taken from the DRF tutorial)
我正在尝试使用 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)
The different methods in the view correspond to the different HTTP Request methods. So if I have www.foo.com/barit would do two different things based on what request method is sent to that address. So that means that I wouldn't have to specify anything else because the function that is executed is determined based on the method the URL is sent with. Is this correct?
视图中的不同方法对应不同的HTTP Request 方法。因此,如果我拥有www.foo.com/bar它,它会根据发送到该地址的请求方法来做两件不同的事情。这意味着我不必指定任何其他内容,因为执行的函数是根据发送 URL 的方法确定的。这样对吗?
I have this view which I tried to model after the example on the DRF site
我有这个视图,我试图在 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
which maps to these URLs
映射到这些 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'),
)
which I am trying to test using CURL with this command (like suggested here DELETE using CURL with encoded URL)
我正在尝试使用带有此命令的 CURL 进行测试(就像这里建议的DELETE using CURL with encoding URL)
curl -X DELETE "http://127.0.0.1:8000/events/delete/1"
This will seem to do what it should:
这似乎会做它应该做的:
[18/Oct/2014 22:41:27] "DELETE /events/delete/1 HTTP/1.1" 404 2707
But the actual record is not deleted from my database
但实际记录并未从我的数据库中删除
Is there something here that I am forgetting to do to get these to get this to work properly?
这里有什么我忘记做的事情以使它们正常工作吗?
采纳答案by Kevin Stone
You're being redundant. The HTTP method is already DELETE, so there's no /events/deletein the url. Try this:
你这是多余的。HTTP 方法已经是DELETE,因此/events/deleteurl 中没有。尝试这个:
curl -X DELETE "http://127.0.0.1:8000/events/1/"
By default, DRF's router creates detailed urls at /event/<pk>and you GET, PUT, POSTand DELETEthem to retrieve, update, create and delete respectively.
默认情况下,DRF 的路由器会在/event/<pk>和 you GET、PUT、POST和DELETE它们处创建详细的 url ,分别用于检索、更新、创建和删除。
回答by Steven Laroche
As mentioned by Kevin Stone, the pattern you're using isn't advisable, but if you want to use it, you'll need to fix the typo in your urls for the events/delete/mapping.
正如 Kevin Stone 所提到的,您使用的模式是不可取的,但是如果您想使用它,您需要修复事件/删除/映射的url 中的拼写错误。
# delete event
url(r'^delete$/(?P<pk>\d+)',
views.EventDetail.as_view(), name='delete_event'),
should be:
应该:
# delete event
url(r'^delete/(?P<pk>\d+)',
views.EventDetail.as_view(), name='delete_event'),

