Django Rest Framework:允许创建序列化器字段,但不能编辑

时间:2018-10-28 03:51:49

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

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

在创建相关模型时(在{{1}上调用Serializer时),是否有任何一种(优雅的)方式可以创建一次create()字段}),但以后不能通过Serializer进行修改吗?

NB :是的,我见过this solution,但老实说,我觉得它很丑陋且不符合Python规范。有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

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方法来做到这一点,方法是在更新时删除此数据

答案 1 :(得分:1)

我认为不存在任何问题,您可以这样指定它,也可以自己继承从DRF的序列化器继承的序列化器。

答案 2 :(得分:1)

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

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')

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

相关问题