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 工作的方法,也找不到任何类似的问题。
查看您的代码片段。 deleteAllCustomers
和 CustomerViewSet
的 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/
来支持 POST
和 DELETE
方法。
所以我更改了 deleteAllCustomers
函数来处理 POST
请求。
(就像他们建议的那样,重新排序 urlpatterns
数组)
代码现在运行良好
这是我使用 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 工作的方法,也找不到任何类似的问题。
查看您的代码片段。 deleteAllCustomers
和 CustomerViewSet
的 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/
来支持 POST
和 DELETE
方法。
所以我更改了 deleteAllCustomers
函数来处理 POST
请求。
(就像他们建议的那样,重新排序 urlpatterns
数组)
代码现在运行良好