Сериализаторы разрешают частичные обновления, задавая partial=True
при инициализации селектора. Это как PATCH
запросы обрабатываются по умолчанию в общих представлениях .
serializer = CommentSerializer(comment, data=request.data, partial=True)
Это позволит вам обновлять отдельные поля в сериализатор или все поля, если вы хотите, без каких-либо ограничений стандартного PUT
запроса.
Я некоторое время боролся с этим, но это очень простая реализация, использующая общие представления или комбинацию общих представлений и mixins.
В случае использования общего представления обновления (generics. UpdateAPIView), просто используйте следующий код, убедившись, что тип запроса - PATCH:
class UpdateUser(generics.UpdateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
Нет ничего другого!
Если вы используете обновление mixin (mixins .UpdateModelMixin) в сочетании с общим представлением (generics.GenericAPIView), используйте следующий код, убедившись, что тип запроса - PATCH:
class ActivateUser(mixins.UpdateModelMixin, generics.GenericAPIView):
serializer_class = UserSerializer
model = User
lookup_field = 'email'
def get_queryset(self):
queryset = self.model.objects.filter(active=False)
return queryset
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
Второй пример более сложный, показывая вам, как переопределить поле запроса и поиска, но код, на который вы должны обратить внимание, - это функция патча.
Кажется, он поддерживается из коробки. В браузере API перейдите на страницу описания модели, внизу рядом с вкладкой HTML Form
нажмите Raw data
, удалите все из строки JSON, кроме поля ID и поля, которое вы хотите изменить, и нажмите PATCH
, Выполняется частичное обновление PATCH
.
Я использую djangorestframework==3.2.4
, и мне не приходилось ничего делать с моими наборами представлений и сериализаторами, чтобы включить это.
В этом exampe мы обновляем поле bool status_field
модели, и я использую jquery 2.2.1. Добавьте в <head>
следующее:
<script src="{% static 'my_app/jquery.min.js' %}"></script>
<script>
$(document).ready(function(){
var chk_status_field = $('#status_field');
chk_status_field.click(function(){
$.ajax({url: "{% url 'model-detail' your_rendering_context.id %}",
type: 'PATCH', timeout: 3000, data: { status_field: this.checked }
})
.fail(function(){
alert('Error updating this model instance.');
chk_status_field.prop('checked', !chk_status_field.prop('checked'));
});
});
});
</script>
Затем в <form>
:
<input type="checkbox" id="status_field" {% if your_rendering_context.status_field %}
checked {% endif %} >
я решил разрешить изменение флажка, а затем вернул его в поле случай отказа. Но вы можете заменить click
на mousedown
, чтобы обновить значение флажка только после того, как вызов AJAX преуспел. Я думаю, что это приведет к тому, что люди будут многократно нажимать флажок для медленных соединений.