我试图通过我的序列化程序使用(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
答案 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不知道哪个值发生了变化。