首页 > 解决方案 > Django Rest Framework DELETE 请求像 GET 请求一样响应

问题描述

我正在尝试删除模型视图集 get_queryset 返回的数据库中的条目。通过 DRF Web 界面和邮递员发送 DELETE 请求时,我收到此响应“DELETE /api/remove_self/3 HTTP/1.1”200 以及我要删除的数据。给出此结果的代码如下所示:

模型.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

视图.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()

网址.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'})),
  
]

任何帮助深表感谢!

标签: python-3.xdjangodjango-rest-frameworkhttprequest

解决方案


您正在将方法映射DELETElist您的网址中。

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

正确的做法:

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

各种方法的映射:

  • POSTcreate
  • GETretrieve
  • PUTupdate
  • PATCHpartial_update
  • DELETEdestroy

推荐阅读