如何在DRF的UpdateAPIView中使用PATCH?

时间:2019-03-14 17:18:08

标签: python django reactjs django-rest-framework axios

我看过很多地方,但是很难找到一个简单的示例来说明如何在Django Rest Framework的Update API View中使用PATCH。我知道这是一个非常简单的问题。

这是交易:我有一个复选框输入。选中该复选框后,如果用户取消选中所述复选框,则应将关联模型的date值设置为None,并且得到的JSON响应应为带有w /其date字段已更新。如果未选中该框,则选中该框应将关联模型的date值设置为timzone.now(),并且得到的JSON respone应该再次是模型的序列化,且其date字段已更新

发送请求的函数很简单:

updateThing(pk, mark){
        const url = `${API_URL}/api/goals/${pk}/${mark}`;
        return axios.patch(url);
    }

与我的urls.py中的此项对应:

...
path('/<int:pk>/<str:mark>', views.ThingUpdate.as_view()),
...

This线程讨论了重写partial_update方法。所以我尝试了(根据线程):

class ThingUpdate(generics.UpdateAPIView):
    serializer_class = ModelSerializer

    def get_queryset(self):
        return Thing.objects.filter(pk=self.kwargs['pk'])

    def partial_update(self, request, *args, **kwargs):
        model = self.get_object()
        if mark == 'completed':
            model.created_on = timezone.now()
            model.save()
        elif mark == 'uncompleted':
            model.created_on = None
            model.save()

        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

这将导致{"detail": "Not found"}

This线程使用APIVeiw,而不是UpdateAPIView。此外,该字段实际在哪里更改?

如果我尝试更改发送请求的函数,如下所示:

updateThing(pk, mark){
        const url = `${API_URL}/api/goals/${pk}`;
        var data = {completed_on: null}
        if (mark == 'completed') {
            var data = {completed_on: moment()}
        }
        return axios.patch(url, data);
    }

...并尽可能使UpdateAPIView裸露(仅定义serializer_classqueryset属性),我得到的响应是模型的JSON ,其中{即使请求中发送的参数正确,{1}}日期仍为completed_on 。 (我还尝试过null来模仿模型中的内容)。

我花了太多时间试图解决这个问题。有人可以使用moment().format('YYYY-MM-DD')指向我正确的方向吗?

0 个答案:

没有答案