django使用SerializerMethodField序列化和反序列化对象

时间:2019-06-20 09:34:07

标签: django serialization

我正在使用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字段。 它甚至似乎都没有经过串行器(调试时)。

有什么主意我应该如何反序列化,所以这个不属于模型的字段将成为新实例的一部分?

1 个答案:

答案 0 :(得分:0)

如果在反序列化之后需要将owner作为对象的属性,则需要根据documentation中所述的要求更新createupdate方法。 / 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()