【问题标题】:Django REST Serializer - Partial update still updates full recordDjango REST Serializer - 部分更新仍然更新完整记录
【发布时间】:2016-03-10 08:09:54
【问题描述】:

我正在尝试通过我的序列化程序使用 (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

【问题讨论】:

  • 更新了哪些字段?可能有些字段是用 save 方法写的
  • 你可以发布你的模型吗?
  • @ilse2005 正在更新所有字段。我也发布了我的模型。
  • 我的回答对您有帮助吗?如果是,请接受。

标签: django serialization django-rest-framework


【解决方案1】:

我想我现在明白了你的问题。正如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 不知道哪个值改变了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2022-11-09
    • 2020-04-12
    • 1970-01-01
    • 2017-09-12
    • 2021-07-27
    • 2014-03-04
    相关资源
    最近更新 更多