有没有人知道如何基于此models.py
在factoryboy中创建工厂class Halte(models.Model):
koppel_halte1 = models.ForeignKey('self',
related_name='koppel_halteA',
verbose_name="Koppel Halte",
help_text="geef hier een gekoppelde halte aan",
null=True, blank=True)
koppel_halte2 = models.ForeignKey('self',
related_name='koppel_halteB',
verbose_name="Koppel Halte",
help_text="geef hier een gekoppelde halte aan",
null=True, blank=True)
注意'自我'? (是的,这种关系是必要的。)
我在FactoryBoy(SubFactory,RelatedFactory,SelfAtribute,PostGeneration)中尝试了几件事,但我无法让它工作。
在factories.py
中的一次尝试class HalteFactoryA(factory.DjangoModelFactory):
class Meta:
model = models.Halte
class HalteFactoryB(factory.DjangoModelFactory):
class Meta:
model = models.Halte
class HalteFactory(factory.DjangoModelFactory):
class Meta:
model = models.Halte
# todo: how to do this?? (see models.Halte)
koppel_halte1 = factory.RelatedFactory(HalteFactoryA)
koppel_halte2 = factory.RelatedFactory(HalteFactoryB)
有什么建议吗?
谢谢。
答案 0 :(得分:7)
@bakkal大部分都是正确的,但一个重要的缺失因素是必须指定目标递归深度,如本期所述: https://github.com/rbarrois/factory_boy/issues/173
# myproj/myapp/factories.py
class MyModelFactory(factory.Factory):
class Meta:
model = models.MyModel
parent = factory.SubFactory('myapp.factories.MyModelFactory')
然后需要添加一个递归最大深度,或者你得到无限深度达到错误(如评论中@Sjoerd van Poelgeest所述):
m = MyModelFactory(parent__parent__parent__parent=None)
在这种情况下,我们允许创建3的深度,最后一个将具有空父。
答案 1 :(得分:1)
为了让工具更容易内省您的模型,而不是'self',
使用完全限定的模型名称:
koppel_halte1 = models.ForeignKey('yourapp.Halte', ...)
koppel_halte2 = models.ForeignKey('yourapp.Halte', ...)
请注意,它是一个字符串'yourapp.Halte'
而不是yourapp.Halte
。
如果您坚持在模型中使用'self'
,则可以在SubFactory
# yourapp/factories.py
class HalteFactory(factory.Factory):
class Meta:
model = yourapp.Halte
koppel_halte1 = factory.SubFactory('yourapp.factories.HalteFactory')
koppel_halte2 = factory.SubFactory('yourapp.factories.HalteFactory')
答案 2 :(得分:0)
我没有通过Factory Boy修复它,但旧式设置确实有效。
然后我(不情愿地)使用标准。
class ModelHalteSelfTests(TestCase):
def setUp(self):
self.lijn1 = Lijn.objects.create(id=1, nummer=1, techniek=GlobalWaardes.TECHNIEK_BUS)
self.lijn2 = Lijn.objects.create(id=2, nummer=2, techniek=GlobalWaardes.TECHNIEK_TRAM)
self.halte1 = Halte.objects.create(id=1, nummer=100, aantal_vitrinekasten=2, aantal_hpkasten=0)
self.halte2 = Halte.objects.create(id=2, nummer=200, aantal_vitrinekasten=1, aantal_hpkasten=1)
self.halte3 = Halte.objects.create(id=3, nummer=300, aantal_vitrinekasten=0, aantal_hpkasten=3)
self.halte4 = Halte.objects.create(id=4, koppel_halte1=self.halte1, koppel_halte2=self.halte2)
self.halteregel1 = Halteregel.objects.create(id=1, lijn=self.lijn1, halte=self.halte1, volgorde=10)
self.halteregel2 = Halteregel.objects.create(id=2, lijn=self.lijn1, halte=self.halte2, volgorde=20)
self.halteregel3 = Halteregel.objects.create(id=3, lijn=self.lijn2, halte=self.halte2, volgorde=20)
self.halteregel4 = Halteregel.objects.create(id=4, lijn=self.lijn2, halte=self.halte3, volgorde=10)
def test_lijst_halteregels(self):
self.assertEqual(self.halte1.lijst_halteregels(), [self.halteregel1])
self.assertEqual(self.halte2.lijst_halteregels(), [self.halteregel2, self.halteregel3])
self.assertEqual(self.halte3.lijst_halteregels(), [self.halteregel4])
self.assertEqual(self.halte4.lijst_halteregels(), [self.halteregel1, self.halteregel2, self.halteregel3])