这是我使用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工作,也找不到任何类似的问题。
查看您的代码片段。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、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/
来支持POST
和DELETE
方法。
因此,我将deleteAllCustomers
函数更改为也处理POST
请求。(正如他们所建议的,重新排序urlpatterns
阵列(
代码现在运行良好😁