Django Rest Framework:允许创建一个序列化程序字段,但不允许编辑



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

有没有什么(优雅的(方法可以在创建有问题的模型时(在Serializer上调用create()时(创建一个Serializer字段,只创建一次,但以后不能通过update修改?

NB:是的,我见过这个解决方案,但老实说,我觉得它很丑陋,而且不符合Python。有更好的方法吗?

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

通过"不优雅",我假设您只需要一个用于创建和更新的序列化程序。您也许可以考虑重写序列化程序的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')

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

我认为没有,你可以这样指定它,或者制作自己的序列化程序,继承DRF的序列化程序。

为了使字段在更新时为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((不包含在有效负载中,则在创建时不会被调用。

相关内容

最新更新