我需要创建一个与给定规范一致的棉花糖模式,在该模式中我不能更改密钥名称。其中一个关键字是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()
这就是它是如何实现的,我希望你能理解,它的纯代码
快乐编码