我们正在使用Django Rest Framework构建API,我们的客户希望它具有此端点:
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
参数来更改路由,但是如果它为None或为空,则再次默认为update_status
。
我也可以只在一个不同的视图中定义此端点并手动路由,但这在我看来是一个较差的解决方案,将其包含在我已经拥有的视图集中会很好。
谢谢。
答案 0 :(得分:2)
Django REST框架允许binding viewsets to URLs explicitly。您可以从视图集中创建一组视图,并在没有路由器的情况下绑定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'),
]
答案 1 :(得分:0)
我只需要这样做,发现在urls.py
中设置路由器时,它可以工作:
router = routers.SimpleRouter()
# Post Edit route.
router.routes[2].mapping['post'] = 'partial_update'
router.register(r'things', ThingViewSet)
另一种方法是您构建自己的Router。哪个也不错。
供参考here's the bit of code,用于定义要更改的数组。