序列化时如何将schema属性映射到另一个键



我需要创建一个与给定规范一致的棉花糖模式,在该模式中我不能更改密钥名称。其中一个关键字是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(?

使用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)

为了实现这一点,您需要覆盖序列化程序类的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()

这就是它是如何实现的,我希望你能理解,它的纯代码

快乐编码

相关内容

  • 没有找到相关文章

最新更新