2

我想知道我是否只是一个在这个问题上苦苦挣扎的人。

让我们以 dict 为例:

data = {'totalSize': 3000, 'freq': 2400,
        'distribution':
            {'ram1': {'size': 200, 'status': 'OK'},
             'ram2': {'size': 100, 'status': 'OK'}
             }
        }

请注意ram1/2是无法提前知道的动态键

问题,我的 api.model 应该是什么样子?我有:

wild = {"*": fields.Wildcard(fields.String())}
hw_memory = api.model('Memory', {
    'totalSize': fields.Integer(description='total memory size in MB',
                                example=1024),
    'freq': fields.Integer(description='Speed of ram in mhz', example=800),
    'distribution': fields.Nested(wild),
})

它正在工作,但是它不会验证“分发”以下的任何内容,换句话说,就像通配符一样工作,任何东西都将被接受。有没有办法以通配符动态键的方式嵌套字典?

4

1 回答 1

1

首先,Wildcard字段类型接受字典值的定义,而不是键的定义,即fields.Wildcard(fields.String())验证字典值只能是字符串类型(在您的情况下,您需要提供分布的定义)。

第二个错误是您将distributionfield 定义为Nestedobject 而不是使用Wilcard.

以下代码应用于验证目的:


DISTRIBUTION_MODEL = NAMESPACE.model("Distribution", dict(
    size=fields.Integer(),
    status=fields.String(),
))

MEMORY_MODEL = NAMESPACE.model("Memory", dict(
    totalSize=fields.Integer(description='total memory size in MB',
                             example=1024),
    freq=fields.Integer(description='Speed of ram in mhz', example=800),
    distribution=fields.Wildcard(fields.Nested(DISTRIBUTION_MODEL))
))

不幸的是,它不适用于编组。下一个代码应该适用于封送处理,但不适用于验证输入有效负载:


OUTPUT_MEMORY_MODEL = NAMESPACE.model("OutputMemory", dict(
    totalSize=fields.Integer(description='total memory size in MB',
                             example=1024),
    freq=fields.Integer(description='Speed of ram in mhz', example=800),
    distribution=flask_utils.fields.Nested(
        NAMESPACE.model(
            "distributions", {
                "*": fields.Wildcard(
                    # DISTRIBUTION_MODEL is taken from previous snippet
                    fields.Nested(DISTRIBUTION_MODEL)
                )
            }
        )
    )
))
于 2020-08-17T12:11:09.340 回答