Метод django rest framework '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' не разрешен).
Насколько я понимаю, это происходит потому, что этот URL уже назначен DefaulteRouter для методов PUT/POST.
Я попробовал добавить функцию destroy к моему CustomerViewSet, но она вызывается только при удалении одного экземпляра (с первичным ключом, переданным в URL).
Я не нашел способа заставить URL работать и не смог найти похожий вопрос.
Просмотр вашего фрагмента кода. Путь url для deleteAllCustomers и CustomerViewSet одинаковый, т.е. .../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 важен.
Ваш файл views.py для CustomerViewSet должен выглядеть следующим образом для поддержки: GET, PUT, PATCH, RETRIEVE, DELETE
from rest_framework import viewsets, mixins, permissions, authentication
class CustomerViewSet(viewsets.GenericViewSet,
mixins.ListModelMixin,
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)
Теперь код работает отлично 😁