现在,read_only
构造函数上的DRF的Serializer
参数意味着您既不能创建也不更新该字段,而write_only
构造函数上的Serializer
参数允许该字段要创建或更新,但在序列化表示形式时阻止输出该字段。
在创建相关模型时(在{{1}上调用Serializer
时),是否有任何一种(优雅的)方式可以创建一次create()
字段}),但以后不能通过Serializer
进行修改吗?
NB :是的,我见过this solution,但老实说,我觉得它很丑陋且不符合Python规范。有更好的方法吗?
答案 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')
但是,在更新模型时,您必须提供旧的(或某些)字段值。