【发布时间】:2019-08-15 06:47:00
【问题描述】:
我的 SQLAlchemy 模型中有一个多对一的关系。一份报告有许多样本(为简洁起见):
class Sample(db.Model, CRUDMixin):
sample_id = Column(Integer, primary_key=True)
report_id = Column(Integer, ForeignKey('report.report_id', ondelete='CASCADE'), index=True, nullable=False)
report = relationship('Report', back_populates='samples')
class Report(db.Model, CRUDMixin):
report_id = Column(Integer, primary_key=True)
samples = relationship('Sample', back_populates='report')
现在在我的测试中,我希望能够生成Sample 实例或Report 实例,并填写缺失的关系。
class ReportFactory(BaseFactory):
class Meta:
model = models.Report
report_id = Faker('pyint')
samples = RelatedFactoryList('tests.factories.SampleFactory', size=3)
class SampleFactory(BaseFactory):
class Meta:
model = models.Sample
sample_id = Faker('pyint')
report = SubFactory(ReportFactory)
当我去创建这些的实例时,工厂陷入了无限循环:
RecursionError: maximum recursion depth exceeded in comparison
但是,如果我尝试使用SelfAttributes 来停止无限循环,我最终会得到一个没有任何样本的报告:
class ReportFactory(BaseFactory):
samples = RelatedFactoryList('tests.factories.SampleFactory', size=3, report_id=SelfAttribute('..report_id'))
class SampleFactory(BaseFactory):
report = SubFactory(ReportFactory, samples=[])
report = factories.ReportFactory()
l = len(report.samples) # 0
但是,如果我用SampleFactory() 生成Sample,它正确地有一个Report 对象。
我应该如何正确设计我的工厂,使SampleFactory() 将生成一个Sample 与关联的Report,而ReportFactory() 将生成一个Report 与2 个关联的Samples,没有无限循环?
【问题讨论】:
标签: python sqlalchemy factory-boy