factory-boy subfactory传递对象而不是key

时间:2016-11-16 04:45:43

标签: python sqlalchemy factory-boy

我正在使用SQLAlchemy的工厂男孩。

我正在尝试创建Fact对象,我希望工厂男孩生成PatientDim对象,这些对象是Fact的外键。但是Subfactory没有传递密钥,而是将整个对象传递给foreignkey字段。

我怎样才能通过Subfactory传递PatientDim键?

Factories.py

class FactFactory(SQLAlchemyModelFactory):
    class Meta:
        model = models.Fact
        sqlalchemy_session = common.Session

    patient_id = factory.SubFactory(PatientDimFactory)

class PatientDimFactory(SQLAlchemyModelFactory):
    class Meta:
        model = models.PatientDim
        sqlalchemy_session = common.Session

Models.py

class Fact(TimeStampedModel):
    class Meta:
        db_table = 'fact'

    id = Column(Integer, primary_key=True)
    patient_id = Column('patient_id', Integer, ForeignKey(PatientDim.__table__.c.id), nullable=False)
    patient = relationship(PatientDim, foreign_keys='Fact.patient_id' )

Base = declarative_base()
class PatientDim(TimestampMixin, Base):
    __tablename__ = 'patient_dim'

    id = Column('id', Integer, primary_key=True)

2 个答案:

答案 0 :(得分:1)

这似乎与我在此问题中发现的问题相同:Why isn't SQLAlchemy translating this object generated by a FactoryBoy SubFactory into a foreign key? 基于此,问题在于此问题基于patient_id列而不是根据关系patient命名SubFactory。

在这里的示例中:https://github.com/FactoryBoy/factory_boy/blob/master/examples/flask_alchemy/demoapp_factories.py,您会看到它们基于关系而不是外键列来命名SubFactory。因此,将其更新为patient = factory.SubFactory(PatientDimFactory)似乎可以正常工作。

答案 1 :(得分:0)

我今天的解决方法:

从Factory生成dict数据

data = factory.build(dict, FACTORY_CLASS=FactFactory)

创建ForeignKey / subFactory对象

patient_dim = PatientDimFactory()

更改已创建数据中的foreignKey对象

data['patient_id '] = patient_dim.pk

在创建表单中使用创建的数据

form = MyCrateForm(data=data)