So löschen Sie ein Objekt mit Django Rest Framework
Ich bin versucht zu schreiben, eine RESTful API für meine event-Planung-app mit Django Rest Framework, aber ich habe einige Probleme beim Einsatz von views, die nicht erwarten, dass der HTTP-Methode GET. Ich habe gelesen, durch die Anleitung auf der DRF-Website. Von dem was ich verstehe nach dem Lesen durch das tutorial und die Klasse basiert auf Dokumentation anzeigen, auf der Django-Website ist, dass, wenn es eine class-based view wie folgt (entnommen aus der DRF-tutorial)
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)
Den verschiedenen Methoden in der Ansicht entsprechen die verschiedenen HTTP-Request-Methoden. Also wenn ich www.foo.com/bar
es würde tun zwei verschiedene Dinge basierend auf, was die request-Methode wird an diese Adresse gesendet. Das bedeutet also, dass ich nicht etwas anderes angeben, da die Funktion, die ausgeführt wird, bestimmt wird, basierend auf der Methode wird die URL gesendet, mit. Ist das richtig?
Habe ich diese Ansicht, die ich habe versucht, zu modellieren und nach dem Beispiel auf der DRF-Standort
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
welche Karten, um diese URLs
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'),
)
denen ich versuche, test mit CURL mit diesem Befehl (wie hier vorgeschlagen LÖSCHEN Sie mithilfe von CURL mit kodierten URL)
curl -X DELETE "http://127.0.0.1:8000/events/delete/1"
Diese scheinen das zu tun, was es soll:
[18/Oct/2014 22:41:27] "DELETE /events/delete/1 HTTP/1.1" 404 2707
Aber der eigentliche Datensatz wird nicht gelöscht aus meiner Datenbank
Gibt es hier etwas, das ich vergessen habe zu tun, um diese zu bekommen, damit Sie richtig funktionieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie überflüssig. Die HTTP-Methode ist bereits
DELETE
, so gibt es keine/events/delete
in der url. Versuchen Sie dies:Standardmäßig DRF router erstellt detaillierte urls auf
/event/<pk>
und SieGET
,PUT
,POST
undDELETE
abrufen, aktualisieren, erstellen und löschen jeweils.url(r'/events/delete/(?P<pk>\d+)', EventDetail.as_view())
$
in Ihrem urlconf (es signalisiert das Ende der Zeile, also, können nicht Sie erscheinen in der Mitte des url-Muster.Wie erwähnt von Kevin Stein, das Muster, die Sie verwenden ist nicht ratsam, aber wenn Sie es verwenden möchten, müssen Sie beheben den Schreibfehler in urls für die Veranstaltungen/löschen/ mapping.
werden sollte: