如何在 django rest 框架中允许 POST 进行更新操作

Dan*_*iel 5 python django django-rest-framework

我们正在使用 Django Rest Framework 构建 API,我们的客户希望它具有以下端点:

Method: POST
URL: api/v1/application/<id>
Run Code Online (Sandbox Code Playgroud)

它基本上是一个更新端点,但使用 POST 而不是 PUT。

我已经有了这个模型的视图集,我们正在使用创建、列出和检索操作。

所以,我可以做的一件事是在 Django Rest Framework 中允许 POST 进行更新操作,但我还没有找到如何做到这一点。另外,我可以像这样定义一个自定义操作:

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

问题是这个路由到application/<id>/update_status,我可以通过传递url_path参数来更改路由,但如果它是 None 或为空,它只会update_status再次默认。

我也可以在不同的视图中手动定义这个端点并手动路由,但在我看来这是一个更糟糕的解决方案,在我已经拥有的视图集中拥有它会很好。

谢谢。

Luc*_*yne 3

Django REST 框架允许显式地将视图集绑定到 URL。您可以从视图集中创建一组视图并绑定 URL,无需路由器

视图.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
Run Code Online (Sandbox Code Playgroud)

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'),
]
Run Code Online (Sandbox Code Playgroud)