【问题标题】:Method Delete Not Allowed - destroy() method Django不允许删除方法 - destroy() 方法 Django
【发布时间】:2021-09-23 12:21:55
【问题描述】:

我已经在网上寻找这个反复出现的问题的所有可能解决方案,但我没有尝试过任何工作。

我有一个检索和创建特定信息的视图集。作为参考,检索和创建该信息是特定于每个用户的。如果用户已经创建了条目,则不允许他们创建另一个条目。

目前获取和创建的两种方法如下:

class MyViewSet(ModelViewSet):
  queryset = MyModel.objects.all()
  serializer_class = MySerializer

  def get_queryset(self):
    return self.queryset.filter(user=self.request.user.username)

  def create(self, request, *args, **kwargs):
    result = MyModel.objects.filter(user=request.user.username)
    if (result):
      return Response(status=405)

    # Otherwise, create an entry for that user

这两个操作的端点都不在 URL 中包含任何参数。换句话说,它们是GET /my-endpoint/POST /my-endpoint/(因为每个操作都是特定于用户的)

现在,我正在尝试使用destroy() 添加删除操作。我知道 destroy() 有时需要 pk,但从我在网上看到的情况来看,您可以通过指定 pk=None 来绕过它,如下所示。正如我之前提到的,my-endpoint/ 不需要 URL 中的任何参数或参数,因此可以通过调用 DELETE my-endpoint/ 来删除给定用户的条目。

结果,我得到了:

def destroy(self, request, pk=None):
  # This isn't being called when hitting DELETE my-endpoint/. Instead, I get an error as below

[ "detail": "方法 "DELETE" 不允许。" ]

如果知道我没有将任何参数传递给 my-endpoint/ 以进行 DELETE,我该如何解决这个问题?

【问题讨论】:

    标签: python mysql sql django django-rest-framework


    【解决方案1】:

    您收到此错误是因为省略 URL 中的参数将导致 router 获取 createlist(分别为 POSTGET)。但是看到请求方法是DELETE,它会抱怨,因为该端点唯一可用的东西,正如所讨论的,只有POSTGET

    如果你真的想在基本 url 上支持DELETE,你将不得不覆盖构建 url 的路由器的映射(来自上面的链接)。但可能最简单的方法是使用actions 创建一个无需pk 即可删除的新端点:

    class MyViewSet(ModelViewSet):
        ...
        @action(detail=False, methods=['DELETE'], url_path='delete')
        def my_custom_destroy(self, request, *args, **kwargs):
            # will be called by DELETE my-endpoint/delete
    

    【讨论】:

    • 谢谢你。我已经尝试过了,这似乎工作正常。但是,我并不热衷于将端点重新定义为不同的路径。我将如何覆盖路由器的映射以支持没有 pk 的删除?我看过你的链接,但我不确定从哪里开始说实话。
    • 我试图覆盖映射以支持这一点,但我遇到了一些问题,使其与GenericViewSetAPIView 的其他方法一起工作。一旦我设法解决它,我会通知你。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2021-02-19
    • 2015-05-13
    相关资源
    最近更新 更多