我对棉花糖还不太熟悉,但我的问题是如何处理类似dict的对象。棉花糖文档中没有可行的示例。我在stack overflowOriginal 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": "[email protected]",
            "friends": ["Mike"]
        },
        "Mike": {
            "name": "Mike",
            "email": "[email protected]",
            "friends": []
        }
   }
}
"""

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

但是,当我运行代码时,会得到以下非类型值
`None`

输入尚未整理。
我正在使用棉花糖3.0.0b20的最新测试版。即使看起来这么简单,我也找不到办法让它起作用。这些信息似乎表明框架正在处理嵌套字典。
目前,我在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"
            }
        }
    }

这只是一个玩具数据,但举例说明字典中的键不是固定的,它们在数字和文本上都会发生变化。
所以问题是为什么我会在一个简单的例子中得到验证错误,如果可以使用棉花糖框架来验证我的数据,
谢谢

最佳答案

代码中有两个问题。
第一个是post_load decorator的缩进。您在这里复制代码时引入了它,但是您运行的代码中没有它,否则您将不会得到None
第二个原因是棉花糖3的adocumented变化。预/后加载/转储函数应返回该值,而不是对其进行更改。
这是一个有效的版本我还重新设计了装潢师:

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": "[email protected]",
                "friends": ["Mike"]
            },
            "Mike": {
                "name": "Mike",
                "email": "[email protected]",
                "friends": []
            }
        }
    }
"""

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

最后,marshmallow 2中的Dict没有键/值验证功能,因此它将静默地忽略keysvalues参数,而不执行验证。

关于python - Python棉花糖:字典验证错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53255317/

10-12 18:13