2014-11-30 4 views
1

Я пытаюсь частично обновить экземпляр с помощью partial=True, но независимо от того, какой из атрибутов отсутствует, я получаю сообщение об ошибке This field cannot be blank.. Я думал, partial=True позволяет частичное обновление. Я что-то упустил?Как частично правильно обновить?

class MySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = MyModel 
     fields = ('meta_name', 'meta_num_files', 'meta_total_length') 
... 
class MyViewClass(APIView): 
    def post(self, request): 
     instance = get_object_or_404(MyModel, foo='foo') 
... 
     serializer = MySerializer(instance, data, partial=True) 
... 
self.client.post(reverse('api_meta', data={'meta_name': '', 
              'meta_total_length': 1000000, 
              'meta_num_files': 10 
              } 
            ) 
+0

Это происходит, если вы не включили пустое поле? –

ответ

2

Существует разница между частичными обновлениями, где вы только обновляете подмножество полей на сериализаторе и необязательного полем, где значение может быть пустым.

При использовании частичных обновлений клиент может отправлять только подмножество полей в сериализаторе, а сериализатор не требует тех, которые не присутствуют. У этого есть побочный эффект пропущения некоторой проверки, но он ожидает, что поля, не включенные в запрос, уже присутствуют на модели. Проверяются только поля, которые передаются с запросом, и только те поля обновляются в модели.

Вы передаете пустое значение вместо , не передавая ключ вообще. Это эквивалентно выполнению обновления, которое пытается очистить значение поля, что совершенно нормально в ситуациях частичного обновления, поэтому Django REST Framework проведет проверку в пустое поле. Это, как представляется, не документировано нигде, но именно так Django REST Framework определяет, какие поля запускают проверку.

Поскольку ваше поле не содержит empty=True, Django REST Framework поймет, что это обязательное поле и не может быть пустым. Вот почему вы получаете сообщение об ошибке This field cannot be blank, вы говорите ему, чтобы очистить значение поля.

Смежные вопросы