Я смотрел во многих местах, но мне довольно трудно найти простой пример того, как можно использовать PATCH
в Обновлении API представления Django Rest Framework .Я знаю, что это довольно простая проблема.
Вот сделка: у меня есть флажок ввода.Когда это проверено, если пользователь снимает флажок , отмеченный флажком, значение date
связанной модели должно быть установлено на None
, и полученный ответ JSON должен быть сериализацией модели с ее полем date
обновлено.Если флажок снят, то при его установке следует установить значение date
связанной модели на timzone.now()
, и полученный ответ JSON должен снова стать сериализацией модели с обновленным полем 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()),
...
Этот поток говорит о переопределенииметод 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"}
Этот поток использует 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 модели, где дата completed_on
равна null
, даже если параметры, отправленные в запросе, верны.(Я также пытался moment().format('YYYY-MM-DD')
подражать тому, что уже есть в модели).
Я потратил слишком много часов, пытаясь понять это.Может ли кто-нибудь указать мне правильное направление, используя UpdateAPIView
?