Flask 棉花糖序列化与父字段嵌套

Flask 棉花糖序列化与父字段嵌套,flask,marshmallow,Flask,Marshmallow,对不起,如果以前有人问过这个问题,我实际上找不到解决方案或类似的问题(可能用错了词) 我正在使用marshmallow和peewee更新一个现有的FlaskAPI,该API接收来自我们无法控制的客户端(无法更改JSON数据格式)的数据 数据格式如下所示: { "site_id": "0102931", "update_date": "2018/02/11-09:33:23", "updated_by": "chan1", "crc": "a82131cf232ff

对不起,如果以前有人问过这个问题,我实际上找不到解决方案或类似的问题(可能用错了词)

我正在使用marshmallow和peewee更新一个现有的FlaskAPI,该API接收来自我们无法控制的客户端(无法更改JSON数据格式)的数据

数据格式如下所示:

{
    "site_id": "0102931",
    "update_date": "2018/02/11-09:33:23",
    "updated_by": "chan1",
    "crc": "a82131cf232ff120aaf00001293f",
    "data": [{"num": 1,
              "id": "09213/12312/1",
              "chain": "chain2",
              "operator": "0000122",
              "op_name": "Fred",
              "oid": "12092109300293"
             },
             {"num": 2,
              "id": "09213/12312/2",
              "chain": "chain1",
              "operator": "0000021",
              "op_name": "Melissa",
              "oid": "8883390393"
             }]           
}
我们对主块中的任何内容都不感兴趣,但对site_id感兴趣,在反序列化以创建模型和存储数据时,必须将其复制到列表中的每个对象中

这是peeewee中的模型:

class production_item(db.Model):
   site_id = TextField(null=False)
   id_prod = TextField(null=False)
   num = SmallIntegerField(null=False)
   chain = TextField(null=False)
   operator = TextField(null=False)
   operator_name = TextField(null=True)
   order_id = TextField(null=False)
这是marshamallow模式:

class prodItemSchema(Schema):
    num=String(required=True)
    id=String(required=True)
    chain=String(required=True)
    operator=String(required=True)
    op_name=String(required=False, allow_none=True)
    oid=String(required=False, allow_none=True)
我找不到通过load()方法和prodItemSchema的预加载/后加载装饰器从主结构传递站点id的方法,因此无法创建模型。另外,我想让marshmallow为我验证整个结构,而不是像他们现在在代码中所做的那样,在资源和模式之间分两部分进行验证


但是在文档中找不到这样的方法,这可能吗?

在marshmallow中,可以在序列化之前通过使用父方案上的decorator设置。一旦设置了上下文,就可以使用从父级获取值

类父级(架构):
id=fields.String(必需=True)
数据=字段。嵌套('Child',many=True)
@预卸载
def set_上下文(自身、父项、**kwargs):
self.context['site_id']=parent['id']
返回数据
类子(架构):
site\u id=fields.Function(从父项继承)
def从父对象(子对象、上下文)继承对象:
子项['site\u id']=上下文['site\u id']
返回儿童

在棉花糖中,可以在序列化之前使用父方案上的装饰器来设置值,从而将值从父方案传递给其子方案。一旦设置了上下文,就可以使用从父级获取值

类父级(架构):
id=fields.String(必需=True)
数据=字段。嵌套('Child',many=True)
@预卸载
def set_上下文(自身、父项、**kwargs):
self.context['site_id']=parent['id']
返回数据
类子(架构):
site\u id=fields.Function(从父项继承)
def从父对象(子对象、上下文)继承对象:
子项['site\u id']=上下文['site\u id']
返回儿童

我不认为只有一个架构就可以做到这一点。您可能需要两个架构,一个用于主对象,另一个用于“数据”,并在主对象架构内的预加载或后加载挂钩中执行所需操作。我尝试了嵌套架构,但找不到从父架构收集站点id值的方法,所以我最终选择了另一种方式。我将用代码自动回答我自己的问题,这可能是一种更好的方法,但这一种很有效。我不相信只有一个模式可以做到这一点。您可能需要两个模式,一个用于主对象,一个用于“数据”,并在主对象模式内的加载前或加载后挂钩中执行所需操作。我尝试了嵌套模式,但是找不到从父模式收集site_id值的方法,所以我最终选择了另一种方法。我会用代码自动回答我自己的问题,这可能是一个更好的方法,但是这个方法很有效。哦,酷,我不知道你可以用这种方式使用上下文!哦,太酷了,我不知道你能用这种方式使用上下文!