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



这是我使用Django的第一个项目,我在URL方面遇到了一些问题。

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

为了获得所有的基本URL,我使用了rest_framework.routers.DefaultRouter并注册了CustomerViewSet,如下所示:

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

然后像这样注册URL:

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"(。

据我所知,之所以会发生这种情况,是因为DefaulteRouter已经为PUT/POST方法分配了该URL。

我尝试在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、RETRIVE、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视图。

感谢Oluwatomicsin Omotosho James帮助我。

我忘了提到,在我的情况下,我需要URL/customers/来支持POSTDELETE方法。

因此,我将deleteAllCustomers函数更改为也处理POST请求。(正如他们所建议的,重新排序urlpatterns阵列(

代码现在运行良好😁

相关内容

最新更新