如何使用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
相关产品推荐
相关产品推荐

