You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:05:32