我正在使用djangorestframework 3.7.7
我有不包含“所有者”字段的“项目”模型。 项目模型序列化器如下所示:
class ItemSerializer(serializers.ModelSerializer):
id = serializers.CharField(required=False, max_length=1000, allow_null=True)
owner = serializers.SerializerMethodField()
class Meta:
model = Item
fields = [
'id',
'owner'
]
def get_owner(self, item):
return item.package.owner if item.package else None
使用以下命令进行序列化时:
ser_item = ItemSerializer(item)
我在owner
中得到了ser_item.data
字段
但是反序列化时,请使用:
serializer = ItemSerializer(data=ser_item)
serializer.is_valid(raise_exception=True)
obj = Item(**serializer.validated_data)
obj
不包含owner
字段。
它甚至似乎都没有经过串行器(调试时)。
有什么主意我应该如何反序列化,所以这个不属于模型的字段将成为新实例的一部分?
答案 0 :(得分:0)
如果在反序列化之后需要将owner
作为对象的属性,则需要根据documentation中所述的要求更新create
,update
方法。 / p>
在您的情况下,序列化器将变为:
class ItemSerializer(serializers.ModelSerializer):
id = serializers.CharField(required=False, max_length=1000, allow_null=True)
owner = serializers.SerializerMethodField()
class Meta:
model = Item
fields = [
'id',
'owner'
]
def get_owner(self, item):
return item.package.owner if item.package else None
def update(self, instance, validated_data):
instance.email = validated_data.get('owner', 'default')
return instance
# same way for create
此外,在反序列化时,您需要提供ser_item.data
而不是ser_item
。同时保存序列化程序以触发更新/创建方法。 (感谢@ user2880391指出这一点,我也错过了。)
serializer = ItemSerializer(data=ser_item.validated_data)
serializer.save()