棉花糖-序列化时如何将架构属性映射到另一个键?

时间:2018-08-07 12:59:10

标签: python marshmallow

我需要创建一个与给定规范一致的棉花糖架构,在该规范中我无法更改键名。一键是Python中的保留关键字“ from”。

class TemporalExtentSchema(Schema):
    from = fields.String(required=True)
    to = fields.String(required=True)

这当然是Python所不允许的,因此我需要编写如下内容:

class TemporalExtentSchema(Schema):
    t_from = fields.String(required=True)
    to = fields.String(required=True)

我想拥有的是:

{
    "from": "2018-01-01",
    "to": "2018-01-10"
}

序列化时是否可以将实例属性映射到另一个键(t_from-> from)?

2 个答案:

答案 0 :(得分:0)

为此,您需要覆盖序列化程序类的 init 方法。 我以为您正在使用ModelSerializer,这就是解决问题的方法,

class TemporalExtentSchemaSerializer(serializers.ModelSerializer):
    class Meta:
        model = TemporalExtentSchema
        fields = ('to', 't_from')

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('data', None)
        fields['t_from'] = fields['from']
        del fields['from']
        kwargs.update({'data':fields})
        super(TemporalExtentSchemaSerializer, self).__init__(*args, **kwargs)

要使用此功能,只需执行以下操作

d = {
"from": "2018-01-01",
"to": "2018-01-10"
}

s = TemporalExtentSchemaSerializer(data=d)
if s.is_valid():
   s.save()

这是实现它的方式,我希望您理解它的简单代码

快乐编码

答案 1 :(得分:0)

使用dump_to / load_from(棉花糖2)或data_key(棉花糖3):

class TemporalExtentSchema(Schema):
    # Marshmallow 2
    t_from = fields.String(required=True, dump_to='from', load_from='from')
    # Marshmallow 3
    t_from = fields.String(required=True, data_key='from')
    to = fields.String(required=True)