python-3.x Django Rest Framework:允许创建序列化字段,但不允许编辑

ncecgwcz  于 2023-11-20  发布在  Python
关注(0)|答案(4)|浏览(157)

目前,Serializer构造函数上的DRF read_only参数意味着您既不能创建也不能更新字段,而Serializer构造函数上的write_only参数允许创建或更新字段,但在序列化表示时阻止输出字段。
有没有一种(优雅的)方法可以让Serializer字段在模型创建时(在Serializer上调用create()时)只创建一次,但之后不能通过update进行修改?

NB:是的,我看过this solution,但老实说,我觉得它很丑,不像Python。有更好的方法吗?

gzszwxb4

gzszwxb41#

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方法中通过在更新时删除此数据来完成此操作

oknwwptz

oknwwptz2#

通过“不优雅”,我假设你只需要一个序列化器来创建和更新。你可能会考虑重写你的序列化器的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')

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

ukdjmx9f

ukdjmx9f3#

我不认为有什么,你要么这样指定它,要么自己做一个序列化器,从DRF的序列化器继承。

de90aj5v

de90aj5v4#

为了使字段在更新时为REQUIRED和只读,我在字段验证时处理了它。

class MyUserProfileSerializer(serializers.ModelSerializer):

    username = serializers.CharField(source='user.username', required=True)
    first_name = serializers.CharField(source='user.first_name')
    last_name = serializers.CharField(source='user.last_name')

    class Meta:
        model = UserProfile
        fields = ['user', 'username', 'first_name', 'last_name', 'phone']
    
        read_only_fields = []

    def validate_username(self, value):
        if not self.instance and not value:      ## Creation and value not provided
            raise serializers.ValidationError('The username is required on user profile creation.')
        elif value and self.instance != value:   ## Update and value differs from existing
            raise serializers.ValidationError('The username cannot be modified.') 
    return value

字符串
您还可以在编辑的情况下将该字段设置为可选的,但您需要将该字段设置为required=False并在validate()方法中进行验证,因为如果未包含在有效负载中,则不会在创建时调用validate_username()。

相关问题