Flask restx 模型嵌套通配符字典
Flask restx model nested wildcard 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),
})
它正在工作,但是它不验证“分布”以下的任何内容,换句话说,它像通配符一样工作,任何东西都会被接受。
有没有办法以具有通配符动态键的方式嵌套字典?
首先,Wildcard
类型的字段接受字典值的定义,而不是键的定义,即fields.Wildcard(fields.String())
验证字典值只能是字符串类型(在您的情况需要提供分布的定义)。
第二个错误是您将 distribution
字段定义为 Nested
对象而不是使用 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)
)
}
)
)
))
我想知道是否只有我一个人在为这样的问题苦苦挣扎。
让我们以字典为例:
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),
})
它正在工作,但是它不验证“分布”以下的任何内容,换句话说,它像通配符一样工作,任何东西都会被接受。 有没有办法以具有通配符动态键的方式嵌套字典?
首先,Wildcard
类型的字段接受字典值的定义,而不是键的定义,即fields.Wildcard(fields.String())
验证字典值只能是字符串类型(在您的情况需要提供分布的定义)。
第二个错误是您将 distribution
字段定义为 Nested
对象而不是使用 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)
)
}
)
)
))