【问题标题】:factory-boy subfactory passes object instead of keyfactory-boy 子工厂传递对象而不是密钥
【发布时间】:2016-11-16 04:45:42
【问题描述】:

我正在使用带有 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)

【问题讨论】:

  • 一年后,没有答案。搞定了吗?

标签: python sqlalchemy factory-boy


【解决方案1】:

我今天的解决方法:

从工厂生成字典数据

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)

【讨论】:

  • 如果你在第一个例子中添加明确的'import factory\n ... \n'会很好,起初我没有意识到'factory'是一个模块名称,而不是一个变量引用到某个工厂。
【解决方案2】:

这看起来与我在这个问题中发现的问题相同: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) 应该可以工作。

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2012-10-09
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2018-05-08
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多