Marshmallow从列表内String属性获取条目失败问题排查
问题解决:Marshmallow一对多关联返回对象引用而非字符串
你的问题出在translated_languages字段的Schema配置上:当处理一对多关联的列表时,ma.String(attribute="language.language")的属性路径错误,导致Marshmallow无法正确提取Language对象的language字段,最终返回对象的字符串引用。
下面是几种可行的解决方案:
方法1:使用Pluck字段(推荐,Marshmallow 3+支持)
Pluck字段可以直接从关联对象中提取指定字段,写法最简洁:
class TypeSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Type include_relationships = True language = ma.String(attribute="language.language", dump_only=True) # 使用Pluck提取每个Language对象的language字段 translated_languages = ma.List(ma.Pluck("language", "language"), dump_only=True)
方法2:使用Nested字段配合仅指定字段
先定义一个极简的LanguageSchema,再通过Nested字段嵌套提取:
class LanguageSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Language language = ma.String(dump_only=True) class TypeSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Type include_relationships = True language = ma.String(attribute="language.language", dump_only=True) translated_languages = ma.List(ma.Nested(LanguageSchema, only=["language"]), dump_only=True)
方法3:使用MethodField自定义序列化逻辑
通过自定义方法手动遍历关联列表并提取字段,灵活性最高:
class TypeSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Type include_relationships = True language = ma.String(attribute="language.language", dump_only=True) translated_languages = ma.MethodField(dump_only=True) def get_translated_languages(self, obj): # 遍历translated_languages列表,返回每个对象的language字段 return [lang.language for lang in obj.translated_languages]
错误原因说明
你原来的写法ma.List(ma.String(attribute="language.language"))中,当处理列表里的每个Language对象时,Marshmallow会尝试访问该对象的language.language属性——但单个Language对象的language是字符串字段,没有下一级的language属性,所以Marshmallow无法解析,最终返回了对象的默认字符串表示(即<api.models.Language object ...>)。
内容的提问来源于stack exchange,提问作者rockets4all
相关产品推荐
相关产品推荐

