2014-10-18 9 views
7

का उपयोग करके किसी ऑब्जेक्ट को कैसे हटाएं I Django Rest Framework का उपयोग करके मेरे ईवेंट प्लानिंग ऐप के लिए एक RESTful API लिखने का प्रयास कर रहा हूं, लेकिन मुझे उन तरीकों का उपयोग करते समय कुछ परेशानी हो रही है जो HTTP विधि प्राप्त करने की अपेक्षा नहीं करते हैं। मैंने डीआरएफ साइट पर ट्यूटोरियल के माध्यम से पढ़ा है। क्या मैं ट्यूटोरियल और Django साइट पर वर्ग आधारित दृश्य प्रलेखन के माध्यम से पढ़ने के बाद समझ में से है कि अगर वहाँ एक वर्ग आधारित इस तरह (डीआरएफ ट्यूटोरियल से लिया)Django 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) 

ध्यान में रखते हुए विभिन्न तरीकों दृश्य है विभिन्न HTTP अनुरोध विधियों के अनुरूप है। इसलिए यदि मेरे पास www.foo.com/bar है तो यह उस पते पर कौन सी अनुरोध विधि भेजी जाती है, इसके आधार पर यह दो अलग-अलग चीजें करेगी। तो इसका मतलब है कि मुझे कुछ और निर्दिष्ट नहीं करना होगा क्योंकि निष्पादित किया गया कार्य यूआरएल के साथ भेजे गए तरीके के आधार पर निर्धारित किया जाता है। क्या ये सही है?

मैं इस दृश्य जो मैं डीआरएफ साइट

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 

जो इन यूआरएल

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

         ) 

जो मैं इस आदेश के साथ कर्ल इसका परीक्षण करना कोशिश कर रहा हूँ करने के लिए नक्शे पर उदाहरण के बाद मॉडल करने के लिए करने की कोशिश की है (जैसा कि यहां बताया गया है DELETE using CURL with encoded URL)

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 

लेकिन वास्तविक रिकॉर्ड मेरी डेटाबेस

से नहीं हटाया जाता है कि यहां कुछ है कि मैं इन इस ठीक से काम करने के लिए प्राप्त करने के लिए भूल रहा है?

उत्तर

16

आप अनावश्यक हैं। HTTP विधि पहले से ही DELETE है, इसलिए यूआरएल में /events/delete नहीं है। इस प्रयास करें:

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

डिफ़ॉल्ट रूप से, डीआरएफ के रूटर /event/<pk> पर विस्तृत यूआरएल बनाता है और आप GET, PUT, POST और DELETE उन्हें पुनः प्राप्त करने, अद्यतन, बना सकते हैं और क्रमशः हटा दें।

+0

लेकिन मेरे बारे में क्या मानचित्रण/घटनाओं/URLConfs में हटाना चाहते हैं? – user3282276

+0

सलाह नहीं दी गई है (यह एंटी-आरईएसटी की तरह है), लेकिन आप अपना urlconf 'url (r'/events/delete/(? P \ d +) ', EventDetail.as_view())' –

+0

जोड़ने के लिए सेट अप करेंगे) मेरे पास वर्तमान में मेरे urlconf में क्या है। क्या यह पहले से निर्दिष्ट पते के साथ काम नहीं कर रहा है? लेकिन आप जो कह रहे हैं उससे मैं इसे – user3282276

2

केविन स्टोन ने उल्लेख किया है, पैटर्न का उपयोग कर रहे उचित नहीं है, लेकिन आप इसे उपयोग करना चाहते हैं, तो आप/घटनाओं के लिए अपने यूआरएल में टाइपो ठीक/ मानचित्रण हटाने की आवश्यकता होगी।

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

स्पष्टीकरण के लिए धन्यवाद, मैंने पूरी तरह से $ – user3282276