6

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

我正在尝试创建 Fact 对象,并且我希望工厂男孩生成作为 Fact 外键的 PatientDim 对象。但是 Subfactory 不传递密钥,而是将整个对象传递给外键字段。

我怎样才能只通过子工厂传递 PatientDim 密钥?

工厂.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

模型.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)
4

2 回答 2

2

我今天的解决方法:

从工厂生成字典数据

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

创建 ForeignKey/subFactory 对象

patient_dim = PatientDimFactory()
    

更改创建数据中的 foreignKey 对象

data['patient_id '] = patient_dim.pk

在创建表单中使用 crated 数据

form = MyCrateForm(data=data)
于 2018-12-27T14:39:07.443 回答
1

这看起来与我在这个问题中发现的问题相同:为什么 SQLAlchemy 不将 FactoryBoy SubFactory 生成的这个对象翻译成外键? 基于此,问题是基于patient_id列而不是关系命名 SubFactory patient

在此处的示例中:https ://github.com/FactoryBoy/factory_boy/blob/master/examples/flask_alchemy/demoapp_factories.py您可以看到他们根据关系命名子工厂,而不是外键的列。所以看起来更新它patient = factory.SubFactory(PatientDimFactory)应该可以工作。

于 2020-08-14T19:41:30.103 回答