Метод 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)

Теперь код работает отлично 😁

Вернуться на верх