DRF: Как сделать поле в сериализаторе необходимым только для создания объекта? [Дубликат]

25
задан pnhegde 16 January 2015 в 10:04
поделиться

4 ответа

Сериализаторы разрешают частичные обновления, задавая partial=True при инициализации селектора. Это как PATCH запросы обрабатываются по умолчанию в общих представлениях .

serializer = CommentSerializer(comment, data=request.data, partial=True)

Это позволит вам обновлять отдельные поля в сериализатор или все поля, если вы хотите, без каких-либо ограничений стандартного PUT запроса.

22
ответ дан Kevin Brown 24 August 2018 в 01:49
поделиться

Я некоторое время боролся с этим, но это очень простая реализация, использующая общие представления или комбинацию общих представлений и 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)

Второй пример более сложный, показывая вам, как переопределить поле запроса и поиска, но код, на который вы должны обратить внимание, - это функция патча.

1
ответ дан Arun 24 August 2018 в 01:49
поделиться

Кажется, он поддерживается из коробки. В браузере 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 преуспел. Я думаю, что это приведет к тому, что люди будут многократно нажимать флажок для медленных соединений.

4
ответ дан Chris 24 August 2018 в 01:49
поделиться
9
ответ дан Community 24 August 2018 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: