使用Python/Marshmallow验证变量字段名的嵌套字典

0 投票
0 回答
21 浏览
提问于 2025-04-12 01:48

给出这个例子...

{
  "A-B": {
    "x": {
      "name": "x A-B"
    },
    "y": {
      "level": 6
    }
  },
  "B-C": {
    "x": {
      "name": "x B-C"
    },
    "y": {
      "level": 9
    }
  },
  "A-C": {
     "x": {
        "name": "x A-C"
    }
 }
}

在这里,“A”、“B”和“C”是状态,而“x”和“y”是不同的字典。“x”可以有一个“name”键,值是字符串;而“y”可以有一个“level”键,值是整数。

这两个“x”和“y”都是可选的。

我已经为“x”和“y”创建了模式...

def X_Schema( Schema ):
  name = fields.String( required = True )

def Y_Schema( Schema ):
  level = fields.Integer( required = True )

我知道我需要使用一些嵌套结构,但我搞不清楚当最上层的“key”不是固定的情况下,这该怎么实现。也就是说,它可以是“A-B”、“A-C”、“B-C”等等。“x”和“y”在一个最上层的值中只能出现一次,两个都是可选的。

我想做类似这样的事情...

def StateSchema( Schema ):
  ???? = fields.Dict( keys = < "x" or "y" >, values = <X_Schema or Y_Schema> )

就我个人而言,我觉得用marshmallow实现这个是不可能的。我无法控制这个输入,所以如果不能用marshmallow来验证,我就基本上无能为力了。

我已经做到这一步了...

class StateSchema( Schema )

  a_b = fields.Dict( keys = fields.String(), values = fields.Nested( X_Schema() ), required = False, data_key = "A-B" )

  b_c = fields.Dict( keys = fields.String(), values = fields.Nested( X_Schema() ), required = False, data_key = "B-C" )

但我觉得这不是最优的,因为我需要为所有可能的状态创建字段.... :(

0 个回答

暂无回答

撰写回答