【问题标题】:How do I serialise a nested dictionary with Marshmallow?如何用 Marshmallow 序列化嵌套字典?
【发布时间】:2018-12-23 18:04:12
【问题描述】:

我是棉花糖和烧瓶等的新手。 我试图通过创建一个使用 jsonified python 字典的 API 来学习。字典包含这样的嵌套字典。它还包含一些 Null 项。

{
    "TITLE": "XXX",
    "NAME": "Mongoose",
    "TIME": "0430",
    "USED": null,
    "DESCRIPTION": "",
    "WEAPONS": {
        "HEAT": "Israel",
        "RADAR": "Flat",
        "CONV": {
            "S": true,
            "N": false,
            "A": false
         },
    },
}

我只是想把它用回字典类型。 POST 操作中的类似内容

fields_schema = FieldSchema(many=True)
field_schema = FieldSchema()

json_data = request.get_json(force=True)
if not json_data:
    return {'message': 'No input data provided'}, 400
# Validate and deserialize input
try:
    data = field_schema.load(json_data)
except ValidationError as e:
    return e.messages, 422

数据只是一个嵌套字典。

它定义了导致我出现问题的模式类。 据我所知,在定义架构时,棉花糖没有 JSON 类型,当我使用 fields.Dict 时,出现以下错误:

{
    "meta": [
        "Missing data for required field."
    ],
    "TITLE": [
        "Unknown field."
    etc...

我不确定我是否应该考虑使用嵌套架构,或者我是否完全把事情复杂化了。

我的 fields_schema 目前如下所示:

class FieldSchema(ma.Schema):
    id = fields.Integer()
    meta = fields.Dict(required=True)

任何指针将不胜感激

【问题讨论】:

    标签: python-3.x dictionary flask flask-sqlalchemy marshmallow


    【解决方案1】:

    如果要验证嵌套对象,可以使用 Marshmallow 的 fields.Nested 功能。

    用他们的例子

    from marshmallow import Schema, fields, pprint
    
    class UserSchema(Schema):
        name = fields.String()
        email = fields.Email()
        created_at = fields.DateTime()
    
    class BlogSchema(Schema):
        title = fields.String()
        author = fields.Nested(UserSchema)
    
    user = User(name="Monty", email="monty@python.org")
    blog = Blog(title="Something Completely Different", author=user)
    result = BlogSchema().dump(blog)
    pprint(result)
    # {'title': u'Something Completely Different',
    #  'author': {'name': u'Monty',
    #             'email': u'monty@python.org',
    #             'created_at': '2014-08-17T14:58:57.600623+00:00'}}
    

    您需要从根文档定义架构。类似的东西

    class Widget(Schema):
        TITLE = fields.String()
        NAME = fields.String()
        # ...
        WEAPONS = fields.Nested(Weapon)
    
    class Weapon(Schema):
        HEAT = fields.String()
        # ...
    

    可能会让你继续前进。

    【讨论】:

    • 谢谢。我会尝试沿着这条路线走。但另一个问题......如果我不想在序列化过程中验证数据,那会改变解决方案吗?
    • 如果您不想进行任何验证,当然可以在 json_data = request.get_json(force=True) 处停止。如果您不想验证 WEAPONS 的内部,但确实想验证其余部分,则可以将其定义为 fields.Dict()(而不是嵌套模式)。
    • 感谢您的回答,这让我更清楚了。
    • @AndrewF,关于如何使用 flask_marshmallow 我们可以序列化 postgress such as heredb.Column(JSONB) 列的任何建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2014-02-19
    • 2011-09-18
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多