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

如何使用Factory Boy和SQLAlchemy创建依赖工厂并解决外键赋值报错

报错的核心原因是RfqFactory中将SubFactory(UserFactory)生成的User对象直接赋值给了creator_id字段,而该字段在模型中定义为存储外键整数值的字段,无法接收ORM对象,因此触发类型适配错误。


方案1:添加ORM关系映射(推荐)

这种写法更符合SQLAlchemy的使用规范,不需要手动处理外键赋值,ORM会自动完成映射。

第一步 修改Rfq模型,新增关联字段

class Rfq(Base):
    __tablename__ = "rfq_rfq"

    id = Column(
        Integer,
        primary_key=True,
    )
    title = Column(Text)
    description = Column(Text)
    creator_id = Column(
        ForeignKey(User.id, deferrable=True, initially="DEFERRED"), index=True
    )
    # 新增User关联关系
    creator = relationship("User")

第二步 修改RfqFactory,关联对象而非外键字段

class RfqFactory(SQLAlchemyModelFactory):
    class Meta:
        model = Rfq
        sqlalchemy_session = Session
        sqlalchemy_session_persistence = "commit"
   
    id = Sequence(lambda n: n)
    title = Faker("word")
    description = Faker("paragraph")
    # 替换原来的creator_id赋值,直接关联对象
    creator = SubFactory(UserFactory)

方案2:直接生成外键ID值

如果不需要添加关联关系,可直接从生成的User对象中提取id赋值给creator_id:

import factory
class RfqFactory(SQLAlchemyModelFactory):
    class Meta:
        model = Rfq
        sqlalchemy_session = Session
        sqlalchemy_session_persistence = "commit"
   
    id = Sequence(lambda n: n)
    title = Faker("word")
    description = Faker("paragraph")
    # 直接生成User并取id字段赋值
    creator_id = factory.LazyAttribute(lambda _: UserFactory.create().id)

内容的提问来源于stack exchange,提问作者Sion Abraham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:36:05