在Django REST中反序列化之前我可以使用什么方法?

时间:2014-11-27 22:59:52

标签: python django django-rest-framework

假设我在Django REST中有这个序列化器:

class MySerializer(serializers.ModelSerializer):
    age = serializers.SerializerMethodField('get_age')

    class Meta:
        model = MyModel
        fields = ('field1', 'field2', 'age')

    def get_age(self, obj):
        return obj.age * 100

现在适用于序列化。

但现在我想要它,以便在我反序列化时它会divide the age by 100

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我相信在这种情况下可能会使用自定义字段。

class AgeField(serializers.WriteableField):
    def to_native(self, age):
        return age * 100

    def from_native(self, age):
        return int(age) / 100

class MySerializer(serializers.ModelSerializer):
    age = AgeField(source='age')

    def restore_object(self, attrs, instance=None):
        """
        Deserialize a dictionary of attributes into an object instance.
        You should override this method to control how deserialized objects
        are instantiated.
        """
        if instance is not None:
            instance.update(attrs)
            instance.update({'age', attrs['age'] / 100})
            return instance
        return attrs

class Meta:
    model = MyModel
    fields = ('field1', 'field2', 'age')

在此示例中,我们说年龄为10.在序列化程序中,您将显示以下内容:

[
    {
        "field1": "value",
        "field2": "value",
        "age" : 100
    },
]

to_native方法会将值显示为100,就像页面上的表单一样。但是,当提交100作为值时,from_native将触发(age为unicode),然后除以100,以10存储到数据库。这是您要查找的内容吗?

或者,如果您正在讨论严格反序列化,restore_object代码很可能与to_native结合使用。