Как разрешить POST для действия обновления в django rest framework - PullRequest
0 голосов
/ 31 декабря 2018

Мы создаем API с помощью Django Rest Framework, и наши клиенты хотят, чтобы он имел такую ​​конечную точку:

Method: POST
URL: api/v1/application/<id>

Это в основном конечная точка обновления, но с POST вместо PUT.

У меня уже есть набор для этой модели, и мы используем действия создания, списка и извлечения.

Итак, я могу разрешить POST для действий обновления вDjango Rest Framework, но я не нашел, как это сделать.Кроме того, я могу определить пользовательское действие следующим образом:

@action(methods=['post'], detail=True)
def update_status(self, request, pk=None):
    # some code

Проблема заключается в том, что это маршруты к application/<id>/update_status, я могу изменить маршрут, передав параметр url_path, но если он отсутствует или пуст, онпросто по умолчанию снова update_status.

Я также могу просто определить эту конечную точку в другом виде и проложить маршрут вручную, но, на мой взгляд, это худшее решение, было бы неплохо иметь его в наборе, который я ужеесть.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Среда Django REST позволяет явно привязывать наборы к URL-адресам .Вы можете создать набор представлений из своего набора и связать URL-адреса без маршрутизатора

views.py

from restframework import viewsets, mixins

class ApplicationViewSet(mixins.ListModelMixin,
                         mixins.RetrieveModelMixin,
                         mixins.CreateModelMixin,
                         viewsets.GenericViewSet):
    # Your viewset settings 

    def update(self, request, pk=None):
        # Your code

urls.py

from django.urls import path, include

from .views import ApplicationViewSet


app_list = ApplicationViewSet.as_view({
    'get': 'list',
    'post': 'create'
})
app_detail = ApplicationViewSet.as_view({
    'get': 'retrieve',
    'post': 'update',  # POST instead PUT
})


urlpatterns = [
    path('application/', app_list, name='application-list'),
    path('application/<int:pk>/', app_detail, name='application-detail'),
]
0 голосов
/ 31 декабря 2018

Мне просто нужно было это сделать, и я обнаружил, что это работает при настройке маршрутизатора в urls.py:

router = routers.SimpleRouter()
# Post Edit route.
router.routes[2].mapping['post'] = 'partial_update'
router.register(r'things', ThingViewSet)

Альтернативой является создание собственного Маршрутизатора .Что тоже неплохо.

Для справки вот фрагмент кода , который определяет изменяемый массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...