5

私は、Flask と SQLAlchemy (Flask-SQLAlchemy 拡張機能を介して) をFactory_Boyと共に使用しています。

私のGearItemモデルには への外部キーがありGearCategoryます。Factory_BoySubFactoryは、元のファクトリで外部キーとして使用されるオブジェクトを作成する関数を通じてこれを処理します。

ここに私のモデル定義があります:

class GearCategory(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text, unique=True, nullable=False)
    gear_items = db.relationship('GearItem', backref='category',
            lazy='dynamic', order_by='GearItem.name')

class GearItem(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text, nullable=False, index=True)
    category_id = db.Column(db.Integer, db.ForeignKey('gear_category.id'), index=True)

そして、これが私の factory_boyFactory定義です。

class GearCategoryFactory(BaseFactory): # Based on factory.alchemy.SQLAlchemyModelFactory
    class Meta:
        model = gear_models.GearCategory
    name = factory.LazyAttribute(lambda n: faker.word())

class GearItemFactory(BaseFactory):
    class Meta:
        model = gear_models.GearItem
    name = factory.LazyAttribute(lambda n: faker.word())
    category_id = factory.SubFactory(GearCategoryFactory)

問題なく呼び出すことができ、外部キーとして使用することを目的とした aと親のGearItemFactory()両方を明確に生成しています。GearItemGearCategory

ただし、 を呼び出すと、SQLAlchemy は によって作成されたオブジェクトを、外部キーとして使用できる整数にdb.session.flush()変換しません。SubFactory代わりに、オブジェクト自体を基礎となるデータベース ドライバーに渡そうとしますが、データベース ドライバーは、 type のオブジェクトを処理する方法がわからないことを訴えますGearCategory

私が得ているエラーはsqlalchemy.exc.ProgrammingError: (db_driver) can't adapt type 'GearCategory' [SQL: 'INSERT INTO gear_item (...

私は何を間違っていますか?

4

1 に答える 1