我看过很多地方,但是很难找到一个简单的示例来说明如何在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_class
和queryset
属性),我得到的响应是模型的JSON ,其中{即使请求中发送的参数正确,{1}}日期仍为completed_on
。 (我还尝试过null
来模仿模型中的内容)。
我花了太多时间试图解决这个问题。有人可以使用moment().format('YYYY-MM-DD')
指向我正确的方向吗?