Django REST Serializer - 部分更新仍然更新完整记录

时间:2016-03-10 08:09:54

标签: django serialization django-rest-framework

我试图通过我的序列化程序使用(partial = True)部分更新记录,但是,当我查看sql update语句时,它显示当只提交一部分字段时所有字段都在更新。

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

1 个答案:

答案 0 :(得分:2)

我想我现在得到了你的问题。如docs中所述,您可以使用partial关键字来进行部分更新。

  

默认情况下,序列化程序必须为所有必填字段传递值,否则会引发验证错误。您可以使用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不知道哪个值发生了变化。