2016-03-10 2 views
1

Я пытаюсь частично обновить запись, используя (partial = True) через мой сериализатор, однако, когда я смотрю на инструкцию sql update, она показывает, что все поля обновляются когда отправляется только подмножество полей.Django REST Serializer - Частичное обновление по-прежнему обновляет полную запись

class Setting(models.Model): 

    comments_enabled = models.BooleanField(default=True) 
    visibility = models.CharField(max_length=50, choices=VISIBILITIES, 
           blank=False, null=False, 
           default=VISIBILITY_CHOICE_PARTICIPANTS) 
    modified = models.DateTimeField(auto_now=True, blank=True, null=True) 

class SettingsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Setting 
     fields = ('id', 'comments_enabled', 'visibility', 'modified') 


class SomeSerializer(serializers.ModelSerializer): 
    def update(self, instance, validated_data): 
     settings_serializer = SettingsSerializer(instance.settings, data=validated_data.get('settings'), partial=True) 
     settings_serializer.is_valid(raise_exception=True) 
     settings_serializer.save() 

я в два раза проверил, что validated_data словарь передается в имеет только одно поле.

Я использую DRF 3.3 и Django 1.9

+0

Какие поля обновляются? Mabe некоторые поля написаны в методе сохранения – ilse2005

+0

Можете ли вы опубликовать свою модель? – ilse2005

+0

@ ilse2005 все поля обновляются. Я также разместил свою модель. – koeder

ответ

2

Я думаю, что я получил свой вопрос прямо сейчас. Как указано в docs, вы можете использовать ключевое слово partial, чтобы разрешить частичные обновления.

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

Это означает, что вам не нужно публиковать полный объект как JSON. Насколько я вижу, аргумент partial используется только для проверки. В конце концов update method of the serializer вызывается:

def update(self, instance, validated_data): 
    raise_errors_on_nested_writes('update', self, validated_data). 
    for attr, value in validated_data.items(): 
     setattr(instance, attr, value) 
    instance.save() 

    return instance 

Здесь значения из validated_data присвоены экземпляру. В итоге вызываются объекты save. И в этом методе django создает инструкцию SQL для обновления всех значений, поскольку django не знает, какое значение изменилось.

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