2014-10-18 9 views
7

kullanarak nesne silme Django Rest Framework kullanarak etkinlik planlama uygulamam için bir RESTful API yazmaya çalışıyorum ancak GET HTTP yöntemini beklemeyen görünümler kullanırken sorun yaşıyorum. DRF sitesinde öğretici üzerinden okudum. Ben öğretici ve Django sitesinde sınıf temelli bakış belgelerine okuduktan sonra anladığım olduğu bir sınıf tabanlı (DRF öğretici alınan) böyle bir görünümDjango Rest Framework

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) 

görünümde farklı yöntemler varsa farklı HTTP İsteği yöntemlerine karşılık gelir. Yani, www.foo.com/bar varsa, bu yönteme hangi istek yönteminin gönderildiğine bağlı olarak iki farklı şey yapardı. Yani, başka bir şey belirtmek zorunda kalmayacağım anlamına gelir çünkü yürütülen işlev, URL'nin gönderildiği yönteme göre belirlenir. Bu doğru mu?

ben bu komutla CURL kullanarak test etmek çalışıyorum bu URL'lerin

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

         ) 

eşleştiren DRF sitesinde

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 

örneğin sonra modellemek için çalıştı bu görüşü var

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

Bu yapmak gibi görünür (gibi burada DELETE using CURL with encoded URL önerilen) ne yapmalıdır:

[18/Oct/2014 22:41:27] "DELETE /events/delete/1 HTTP/1.1" 404 2707 

Ama asıl rekor veritabanıma

silinmez Bunları bu düzgün çalışması için almak için almak için yapmanız unutmadan burada bir şey var mı?

cevap

16

Fazlalık yapıyorsunuz. HTTP yöntemi zaten DELETE, dolayısıyla URL'de /events/delete yok. Varsayılan olarak

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

, DRF en yönlendirici /event/<pk> de detaylı URL'ler oluşturur ve GET, PUT, POST ve DELETE onları almak için güncelleme oluşturmak ve sırasıyla silin: Bu deneyin.

+0

Ama ne haritalama/olaylar/URLConfs silmek? – user3282276

+0

Tavsiye edilmez (bu bir anti-REST), ancak url'nuzu 'url (r'/events/delete/(? P \ d +) ', EventDetail.as_view()) ' –

+0

eklemek için ayarlayacaksınız. Şu anda urlconf'umda ne var. Belirttiğim adresle çalışmıyor muydu? Ama söylediklerinizden daha fazla cevap vereceğim. Cevabınız için çok teşekkürler Teşekkürler – user3282276

2

Kevin Stone tarafından belirtildiği gibi, kullandığınız desen tavsiye edilmez, ancak bunu kullanmak istiyorsanız, URL'lerinizin URL'lerini events/delete/ eşlemesi için düzeltmeniz gerekir.

# delete event 
url(r'^delete$/(?P<pk>\d+)', 
    views.EventDetail.as_view(), name='delete_event'), 

olmalıdır: Benim hakkımda

# delete event 
url(r'^delete/(?P<pk>\d+)', 
    views.EventDetail.as_view(), name='delete_event'), 
+0

Netleştirdiğiniz için teşekkür ederim. – user3282276