从棉花糖中的嵌套键加载
Loading from nested keys in marshmallow
我正在尝试使用 Marshmallow 从字典中加载嵌套键,但我不知道该怎么做。
例如,我有一个字段 'price'
,它映射到传入字典的值 dictionary['price']['value']
。我找不到 Marshmallow 支持这个的内置方式,所以我尝试使用 pre_load
处理器来展平字典。但是,我无法让它工作。我的示例单元测试因所有嵌套键出现此错误而失败:
Is not a valid string
有什么想法吗?
import unittest
class ResultSchema(Schema):
title = fields.String()
description = fields.String()
brand = fields.String(load_from='brand__name')
price = fields.String(load_from='price__value')
url = fields.String(load_from='url__value')
@pre_load
def flatten_fields(self, data):
keys = [('brand', 'name'), ('price', 'value'), ('url', 'value')]
for outer, inner in keys:
try:
data[outer + '__' + inner] = data[outer][inner]
except (KeyError, TypeError):
pass
return data
class SchemaTests(unittest.TestCase):
def setUp(self):
self.resultSchema = ResultSchema()
self.expected = {
'title': 'fake title',
'description': 'fake description',
'brand': {'name': 'fake brand name'},
'price': {'value': '.99', 'integral': 8299},
'url': {'value': 'fake url'},
'images': [
{'value': 'small url', 'xsize': 60, 'ysize': 60},
{'value': 'small-medium url', 'xsize': 100, 'ysize': 100},
{'value': 'medium-large url', 'xsize': 160, 'ysize': 160},
{'value': 'large url', 'xsize': 400, 'ysize': 400}
]
}
def test_schema_load(self):
loaded, err = self.resultSchema.load(self.expected)
if err:
self.fail(err)
当字段名称 is not found on the input 时,使用 load_from
参数分配的键名称开始生效,如果原始键被删除,您的方法将起作用:
data[outer + '__' + inner] = data[outer][inner]
del data[outer]
但是,为什么不直接更改嵌套字段的值,那么load_from=...
就变得不必要了:
data[outer] = data[outer][inner]
我正在尝试使用 Marshmallow 从字典中加载嵌套键,但我不知道该怎么做。
例如,我有一个字段 'price'
,它映射到传入字典的值 dictionary['price']['value']
。我找不到 Marshmallow 支持这个的内置方式,所以我尝试使用 pre_load
处理器来展平字典。但是,我无法让它工作。我的示例单元测试因所有嵌套键出现此错误而失败:
Is not a valid string
有什么想法吗?
import unittest
class ResultSchema(Schema):
title = fields.String()
description = fields.String()
brand = fields.String(load_from='brand__name')
price = fields.String(load_from='price__value')
url = fields.String(load_from='url__value')
@pre_load
def flatten_fields(self, data):
keys = [('brand', 'name'), ('price', 'value'), ('url', 'value')]
for outer, inner in keys:
try:
data[outer + '__' + inner] = data[outer][inner]
except (KeyError, TypeError):
pass
return data
class SchemaTests(unittest.TestCase):
def setUp(self):
self.resultSchema = ResultSchema()
self.expected = {
'title': 'fake title',
'description': 'fake description',
'brand': {'name': 'fake brand name'},
'price': {'value': '.99', 'integral': 8299},
'url': {'value': 'fake url'},
'images': [
{'value': 'small url', 'xsize': 60, 'ysize': 60},
{'value': 'small-medium url', 'xsize': 100, 'ysize': 100},
{'value': 'medium-large url', 'xsize': 160, 'ysize': 160},
{'value': 'large url', 'xsize': 400, 'ysize': 400}
]
}
def test_schema_load(self):
loaded, err = self.resultSchema.load(self.expected)
if err:
self.fail(err)
当字段名称 is not found on the input 时,使用 load_from
参数分配的键名称开始生效,如果原始键被删除,您的方法将起作用:
data[outer + '__' + inner] = data[outer][inner]
del data[outer]
但是,为什么不直接更改嵌套字段的值,那么load_from=...
就变得不必要了:
data[outer] = data[outer][inner]