【问题标题】:Django Rest Framework: allow a serializer field to be created, but not editedDjango Rest Framework:允许创建序列化器字段,但不能编辑
【发布时间】:2019-04-01 08:47:17
【问题描述】:

现在,Serializer 构造函数上的 DRF 的 read_only 参数意味着您既不能创建也不能更新字段,而 Serializer 构造函数上的 write_only 参数允许创建或更新字段,但阻止序列化表示时输出的字段。

是否有任何(优雅的)方法可以创建一个 Serializer 字段,仅在创建相关模型时(在 Serializer 上调用 create() 时)创建一次,但不能这样稍后通过update修改?

NB:是的,我见过 this solution,但老实说,我觉得它丑陋且不符合 Python 风格。有没有更好的办法?

【问题讨论】:

    标签: python django python-3.x django-rest-framework


    【解决方案1】:
    class TodoModifySerializer(ModelSerializer):
    
        def to_internal_value(self, data):
            data = super(TodoModifySerializer, self).to_internal_value(data)
            if self.instance:
                # update
                for x in self.create_only_fields:
                    data.pop(x)
            return data
    
        class Meta:
            model = Todo
            fields = ('id', 'category', 'title', 'content')
            create_only_fields = ('title',)
    

    您可以在to_internal_value 方法中通过在更新时删除此数据来实现

    【讨论】:

    • 引发错误会更好,否则客户端将不知道为什么数据会消失。
    【解决方案2】:

    通过“不优雅”,我假设您只需要一个用于创建和更新的序列化程序。您或许可以考虑覆盖序列化程序的update 方法,并在保存之前从validated_data 中删除create_only_field

    class MySerializer(serializers.ModelSerializer):
    
        def update(self, instance, validated_data):
            validated_data.pop('create_only_field')
            return super().update(instance, validated_data)
    
        class Meta:
            model = MyModel
            fields = ('id', 'field_one', 'field_two', 'create_only_field')
    

    但是,您必须在更新模型时提供旧的(或某些)字段值。

    【讨论】:

    • 您可以在验证中保留实例值,或者返回验证错误
    【解决方案3】:

    我认为没有,您要么这样指定它,要么制作自己的序列化器,从 DRF 的序列化器继承。

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 2021-09-08
      • 2019-08-27
      • 2015-12-19
      • 2015-11-09
      • 2013-07-07
      • 1970-01-01
      • 2018-05-24
      • 2017-03-04
      相关资源
      最近更新 更多