如何使用Django DRF viewset.Viewsets添加自定义动作函数?

时间:2019-11-07 07:03:26

标签: django django-rest-viewsets

我有一个视图集,我创建了一个@action装饰的函数。

class StoreOffersViewSet(viewsets.ViewSet):
    """Viewset for yoga stuff."""

    @action(detail=False, methods=['put'], name='yoga update')
        def update_yoga(self, request):
            # Get Kwargs passed
            params = self.kwargs

在我的网址中,我有:

router = DefaultRouter(trailing_slash=True)
router.register(r'yoga', views.StoreOffersViewSet, basename='yoga')

urlpatterns = router.urls

我希望当用户向site.com/yoga提出PUT请求时,将调用我的update_yoga函数。

目前,我收到以下错误消息:

{
    "detail": "Method \"PUT\" not allowed."
}

我的猜测是,这是因为对于默认路由器,GET和POST已经具有文档https://www.django-rest-framework.org/api-guide/routers/#defaultrouter中的url样式。因此,我不太确定如何进行。我在django 3.8>

1 个答案:

答案 0 :(得分:-1)

我认为您面临的问题可能出在您调用的 URL 中。要执行您上面提到的操作,您将需要使用此 URL, "/yoga//update_yoga"

如果你想让你的 put 请求调用 update_yoga,那么你可以覆盖默认的 put 函数。

例如

class YogaViewSet(viewsets.ModelViewSet):
    querset = Yoga.objects.all()
    serializer_class = YogaSerializers
    
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)