Python棉花糖:字典验证错误

时间:2018-11-12 02:37:19

标签: python orm marshmallow validationerror

我对棉花糖不熟悉,但是我的问题是关于处理类似dict的对象的问题。棉花糖文档中没有可行的示例。我在堆栈溢出Original question中遇到了一个简单的示例,这是答案的原始代码,假设这应该很简单

from marshmallow import Schema, fields, post_load, pprint

class UserSchema(Schema):
    name = fields.String()
    email = fields.Email()
    friends = fields.List(fields.String())

class AddressBookSchema(Schema):
    contacts =fields.Dict(keys=fields.String(),values=fields.Nested(UserSchema))

@post_load
def trans_friends(self, item):
    for name in item['contacts']:
        item['contacts'][name]['friends'] = [item['contacts'][n] for n in item['contacts'][name]['friends']]


data = """
   {"contacts": { 
        "Steve": {
            "name": "Steve",
            "email": "steve@example.com",
            "friends": ["Mike"]
        },
        "Mike": {
            "name": "Mike",
            "email": "mike@example.com",
            "friends": []
        }
   }
}
"""

deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)

但是,当我运行代码时,我得到了以下NoneType值

`None`

输入未编组。

我正在使用棉花糖3.0.0b20的最新Beta版。即使看起来如此简单,我也找不到找到使之工作的方法。该信息似乎表明该框架正在使用嵌套词典。

当前,我正在为flask的分类应用程序工作,在这里我收到无法真正指定架构的JSON消息。我的具体问题如下:

data = """
   {"book": { 
        "title": {
            "english": "Don Quixiote",
            "spanish": "Don Quijote"
            },
        "author": {
            "first_name": "Miguel",
            "last_name": "Cervantes de Saavedra"
            }
        },
    "book": { 
        "title": {
            "english": "20000 Leagues Under The Sea",
            "french": "20000 Lieues Sous Le Mer",
            "japanese": "海の下で20000リーグ",
            "spanish": "20000 Leguas Bajo El Mar",
            "german": "20000 Meilen unter dem Meeresspiegel",
            "russian": "20000 лиг под водой"
            },
        "author": {
            "first_name": "Jules",
            "last_name": "Verne"
            }
        }
    }

这只是玩具数据,但举例说明字典中的键不是固定的,它们的数字和文本均会更改。

所以问题是为什么我会在一个简单的已经可用的示例中收到验证错误,以及是否有可能使用棉花糖框架来验证我的数据,

谢谢

1 个答案:

答案 0 :(得分:1)

您的代码中有两个问题。

第一个是post_load装饰器的缩进。您在此处复制代码时介绍了它,但您在运行的代码中没有它,否则将不会得到None

第二个原因是棉花糖3中的documented发生了变化。pre / post_load / dump函数应该返回该值而不是对其进行突变。

这是工作版本。我还重新设计了装饰器:

from marshmallow import Schema, fields, post_load, pprint

class UserSchema(Schema):
    name = fields.String()
    email = fields.Email()
    friends = fields.List(fields.String())

class AddressBookSchema(Schema):
    contacts = fields.Dict(keys=fields.String(),values=fields.Nested(UserSchema))

    @post_load
    def trans_friends(self, item):
        for contact in item['contacts'].values():
            contact['friends'] = [item['contacts'][n] for n in contact['friends']]
        return item


data = """
    {
        "contacts": { 
            "Steve": {
                "name": "Steve",
                "email": "steve@example.com",
                "friends": ["Mike"]
            },
            "Mike": {
                "name": "Mike",
                "email": "mike@example.com",
                "friends": []
            }
        }
    }
"""

deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)

最后,棉花糖2中的Dict没有键/值验证功能,因此它只会默默地忽略keysvalues参数,并且不执行验证。 / p>