Django Rest Framework DELETE request responds like a GET request

Viewed 1589

I'm trying to delete an entry in my data base that is returned by a modelviewset get_queryset. When sending a DELETE request through the DRF web interface and via postman, I receive this response "DELETE /api/remove_self/3 HTTP/1.1" 200 along with the data I am trying to delete. The code that gives this result looks like this:

Models.py

class EventAtendee(models.Model):
    """Lists users atending an event"""
    #below connects user profile to event
    id = models.AutoField(primary_key=True)

    event_id = models.IntegerField(null = True)

    user_profile = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )

    def __str__(self):
        return self.event_id

views.py

class RemoveSelfFromEvent(viewsets.ModelViewSet):
    """Remove Yourself From an Event you were attending"""

    authentication_classes = (TokenAuthentication,)
    serializer_class = serializers.EventAtendeeSerializer
    permission_classes = (permissions.UpdateOwnStatus, IsAuthenticated)

    def perform_create(self, serializer):
        """Sets the user profile to the logged in user"""
        #
        serializer.save(user_profile=self.request.user)


    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        #user_profile = self.kwargs['user_profile']
        event_id = self.kwargs['event_id']
        return models.EventAtendee.objects.filter(event_id=event_id, user_profile=self.request.user)

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance):
        instance.delete()

urls.py

router = DefaultRouter(trailing_slash=False)
router.register('events', views.EventAtendeeViewSet, basename='EventAtendee')

urlpatterns = [

    path('remove_self/<event_id>', views.RemoveSelfFromEvent.as_view({'get': 'list', 'delete': 'list'})),
  
]

Any help is much appreciated!

1 Answers

You are mapping the method DELETE to list in your urls.

path('remove_self/<event_id>', views.RemoveSelfFromEvent.as_view({'get': 'list', 'delete': 'list'})),

Correct way to do:

path('remove_self/<pk>', views.RemoveSelfFromEvent.as_view({'get': 'list', 'delete': 'destroy'})),

mapping of various methods:

  • POST : create
  • GET : retrieve
  • PUT : update
  • PATCH : partial_update
  • DELETE : destroy
Related