Flask与Marshmallow嵌套字段问题:一对一关联表字段平展
解决Marshmallow关联表字段直接映射为顶层字段的问题
嘿,我刚好处理过类似的Marshmallow字段映射需求,来帮你理清楚问题和正确的实现方式:
你的需求与初始写法
你有两张一对一关联的表,希望在查询User表时,把关联Account表的字段直接显示为顶层字段,而不是用account.status这种嵌套的点表示法。你原本的可行写法是:
class UserEntitySchema(db_schema.Schema): class Meta: fields = ('id', 'username', 'email', 'confirmed', 'created', 'enabled', 'account.status')
但这种方式返回的字段是嵌套在account下的,不符合你想要的扁平化输出。
你尝试的错误写法
你按照@marke的建议用了Pluck字段,但没达到预期,代码如下:
class AccountEntitySchema(db_schema.Schema): current_status = fields.Str() class Meta: fields =('current_status',) class UserEntitySchema(db_schema.Schema): status = fields.Pluck(AccountSchema, 'current_status') class Meta: fields = ('id', 'username', 'email', 'status')
这里的问题主要有两个:一是可能写错了Schema类名(AccountSchema应该是AccountEntitySchema),二是没有指定data_key参数来重命名输出字段,导致Pluck还是按照默认的关联结构返回。
正确的解决方案(感谢@marke的提示!)
通过给Pluck字段添加data_key参数,就能直接把关联字段重命名为你想要的顶层字段名,具体代码如下:
class AccountEntitySchema(db_schema.Schema): class Meta: fields =('current_status',) class UserEntitySchema(db_schema.Schema): account = fields.Pluck(AccountEntitySchema, 'current_status', data_key='status') # data_key会替换输出的字段名 class Meta: # 要暴露的顶层字段 fields = ('id', 'username', 'email', 'account')
这样处理后,返回的结果里就会直接显示status这个顶层字段,完美替代原来的嵌套写法啦~
内容的提问来源于stack exchange,提问作者mimic
相关产品推荐
相关产品推荐

