У меня есть отношения «многие к одному» в моих моделях 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
Однако, если я попытаюсь использовать SelfAttribute
s для остановки бесконечного цикла, я получу отчет без каких-либо образцов:
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
Однако, если я сгенерирую Sample
с SampleFactory()
, он правильно будет иметь объект Report
.
Как мне правильно спроектировать свои фабрики так, чтобы SampleFactory()
генерировал Sample
со связанными Report
, а ReportFactory()
генерировал Report
с 2 связанными Samples
без бесконечных циклов?