【问题标题】:Django rest framwork: DELETE without pkDjango rest框架:没有pk的DELETE
【发布时间】:2018-12-09 17:48:44
【问题描述】:

我使用 Django Rest 框架。我想做一个 api 来删除这样的对象

DELETE .../items/

删除 request.user 的项目。 (每个用户最多只能创建一个项目,只有所有者才能删除他的项目。)

我使用 mixins.CreateModelMixin、mixins.ListModelMixin、viewets.GenericViewSet 进行列表视图和创建。我试过了

@action(methods=['delete'], detail=False, url_path='')
    def leave(self, request, *args, **kwargs):
     ...

但是 url 模式会去:

.../items/leave/$

如何为此配置路由器或路径?谢谢

【问题讨论】:

  • 你能展示你的视图类吗?
  • 您能显示您当前的网址吗?如果您已经为视图使用路由器,则实际上不需要添加任何内容。由于您指定了@action(detail=False),因此预期的 url 将与您的列表 url 相同,但末尾带有“/leave”。

标签: django django-rest-framework django-views django-rest-viewsets


【解决方案1】:

在 Django rest 框架装饰器中,如果 url_path 为空字符串,则替换为函数名。所以你不能使用 url_path='' 作为 URL 路径。

【讨论】:

    【解决方案2】:

    你可以只使用一个简单的 APIView 和 GET 方法,然后做你想做的事。像这样:

    class MyDeleteAPIView(APIView):
    
        def get(self, request, *args, **kwargs):
            # for example
            try:
                user = request.user
                instance = SomeModel.objects.get(user=user)
                instance.delete()
                return Response({"message":"deleted successfuly"}, status=status.HTTP_200_OK)
            except:
                return Response({"message":"delete fail"}, status=status.HTTP_400_BAD_REQUEST)
    

    现在您可以定义您想要的网址:

    path('delete/', MyDeleteAPIView.as_view(), name='delete'),
    

    【讨论】:

    • 对不起,我想要这样的 api:DELETE '.../items/' 将删除 request.user 的项目,其中 GET '.../items/' 将返回一个列表视图,而不是 api '删除...,或离开'
    • 不,您可以自定义 GET 方法,而不是返回一个列表,执行删除过程。这不专业。但有时你需要这样做
    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2015-07-14
    • 2021-09-04
    • 2019-07-14
    • 2018-12-10
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多