使用SQLAlchemy与Marshmallow序列化关联数据库实体时include_fk因外键非整数类型报错的解决方案问询
Fixing ValueError: invalid literal for int() with base 10: 'sub' in Marshmallow + SQLAlchemy Serialization
嘿,这个问题的根源其实出在你的SQLAlchemy模型定义上,而不是需要找Marshmallow的特殊配置来规避类型转换!咱们一步步来看:
问题核心
你的Operation模型主键key是String(64)类型,但关联的Rule模型中外键operation_key却被定义成了Integer类型——这本身就不符合SQL外键的基本要求:外键的类型必须和它关联的主键类型完全一致。Marshmallow的SQLAlchemyAutoSchema是根据你定义的模型字段类型来自动生成序列化规则的,所以它会尝试把operation_key按Integer类型处理,可实际存储的是字符串值(比如'sub'),自然就抛出了类型转换错误。
解决方案
第一步先修正你的Rule模型定义,把operation_key的类型改成和父表主键匹配的String类型:
class Rule(db.Model): __tablename__ = 'rule' id = db.Column(db.Integer, primary_key=True, autoincrement="auto") # 这里改成String(64),和Operation.key的类型一致 operation_key = db.Column(db.String(64), ForeignKey('operation.key'))
修正模型后,Marshmallow的RuleSchema会自动识别operation_key为字符串类型,序列化时就不会再尝试把它转成整数,你的ValueError问题也就解决了。
额外补充(如果需要自定义字段处理)
万一你有特殊需求(比如模型定义正确,但序列化时要调整类型),也可以在RuleSchema里显式指定字段类型,覆盖自动生成的规则:
class RuleSchema(ma.SQLAlchemyAutoSchema): # 显式指定字段类型 operation_key = ma.String() class Meta: model = Rule include_fk = True
不过在你的场景里,优先修正模型的类型不匹配问题才是最根本的解决办法。
内容的提问来源于stack exchange,提问作者voltae
相关产品推荐
相关产品推荐

