繁体   English   中英

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

[英]How to allow POST for update action in django rest framework

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

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

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

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

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

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

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

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

谢谢。

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'),
]

我只需要这样做,发现在urls.py设置路由器时这是有效的:

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

另一种方法是构建自己的路由器 这也不错。

这里参考的是用于定义此更改的数组的代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM