django rest 框架方法 'DELETE' 不允许,因为 DefaultRouter

django rest framework method 'DELETE' not allowed because DefaultRouter

这是我使用 Django 的第一个项目,我在使用 URLs 时遇到了一些麻烦。

我有一个客户模型,我为它创建了 ModelViewSet,这样我就可以检索、删除和更新数据库中的模型。

为了获得所有基本的 URL,我使用了 rest_framework.routers.DefaultRouter 并像这样注册了 CustomerViewSet

router = routers.DefaultRouter()
router.register(r'customers', CustomerViewSet, basename='customers')

然后像这样注册 URLs:

urlpatterns = [
    path('', include(router.urls), name="customers"),
]

我的问题是我需要添加一个新的 URL 来删除数据库中的所有客户。

我试过这样添加:

urlpatterns = [
    path('', include(router.urls), name="customers"),
    path('customers/', deleteAllCustomers, name='deleteAll'),
]

其中deleteAllCustomers是用api_view(['DELETE']修饰的函数。

当我尝试调用此 URL(使用 Postman)时,出现 405 错误(方法 'DELETE' 不允许)。

据我了解,这是因为 URL 已经由 DefaulteRouter 分配给 PUT/POST 方法。

我尝试向我的 CustomerViewSet 添加一个 destroy 函数,但它仅在删除一个实例时被调用(在 URL 中传递了主键)。

我还没有找到让 URL 工作的方法,也找不到任何类似的问题。

查看您的代码片段。 deleteAllCustomersCustomerViewSet 的 url 路径相同,即 .../customers

我认为您的应用 urls.py 文件应如下所示:

from django.urls import path, include
from rest_framework.routers import DefaultRouter

from customers import views


router = DefaultRouter()
router.register('', views.CustomerViewSet,
                basename="customers")

app_name = 'customers'

urlpatterns = [
    path('customers/', deleteAllCustomers, name='deleteAll'),
    path('', include(router.urls)),
    
]

url 模式的顺序很重要。

CustomerViewSet 的 views.py 文件应如下所示以支持:GET、CREATE、PUT、PATCH、RETRIEVE、DELETE

from rest_framework import viewsets, mixins, permissions, authentication


class CustomerViewSet(viewsets.GenericViewSet,
                       mixins.ListModelMixin,
                       mixins.CreateModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyMixin
                       ):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated)

    serializer_class = serializers.CustomerModelSerializer
    queryset = models.Customers.objects.all()

然后您可以根据需要设置 deleteAllCustomers 视图。

感谢 Oluwatomisin Omotosho James 帮助我。

我忘了说,在我的例子中,我需要 URL /customers/ 来支持 POSTDELETE 方法。

所以我更改了 deleteAllCustomers 函数来处理 POST 请求。 (就像他们建议的那样,重新排序 urlpatterns 数组)

代码现在运行良好