Как использовать PATCH в DRF UpdateAPIView? - PullRequest
0 голосов
/ 14 марта 2019

Я смотрел во многих местах, но мне довольно трудно найти простой пример того, как можно использовать 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...