Django 如何解决factory_boy子工厂调用中的CycleCDefinitionError?
我有以下型号Django 如何解决factory_boy子工厂调用中的CycleCDefinitionError?,django,factory-boy,Django,Factory Boy,我有以下型号 # in ModelA_App/models.py class ModelA(models.Model): TYPEA = 1 TYPEB = 2 TYPE_CHOICES = ( (TYPEA, 'TypeA'), (TYPEB, 'TypeB') ) type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES) name - models.C
# in ModelA_App/models.py
class ModelA(models.Model):
TYPEA = 1
TYPEB = 2
TYPE_CHOICES = (
(TYPEA, 'TypeA'),
(TYPEB, 'TypeB')
)
type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES)
name - models.CharField(max_length = 100)
#in ModelB_App/models.py
from ModelA_App.models import ModelA
class ModelB(models.Model):
label = models.TextFiled()
model_a = models.OneToOneField(ModelA, on_delete=models.CASCADE)
我有以下工厂:
#in ModelA_App/factories.py
class ModelAFactory(factory.django.DjangoModelFactory):
class Meta:
model = ModelA
name = factory.Faker('word')
type = ModelA.TYPEA
#in ModelB_App/factories.py
from ModelA_App.models import ModelA
from ModelA_App.factories import ModelAFactory
class ModelBFactory(factory.django.DjangoModelFactory):
class Meta:
model = ModelB
label = factory.Faker('text')
model_a = SubFactory(ModelAFactory, type = factory.LazyAttribute(lambda o: '%d' % o.type))
class Params:
type = ModelA.TYPEA
我希望能够创建具有TYPEB
的ModelA
对象。
正在尝试行ModelBFactory.create(type=ModelA.TYPEB)
错误结果:
factory.errors.CyclicDefinitionError:循环惰性属性定义
对于“类型”;在['type'中找到循环
此外,当我将Params
类中的type
名称更改为例如model\u type
时,具有:
model_a = SubFactory(ModelAFactory, type = factory.LazyAttribute(lambda o: '%d' % o.model_type))
它失败了
AttributeError:参数“模型类型”未知
我怎样才能实现我的目标?我找到了解决办法<代码>模型工厂应如下所示:
#in ModelB_App/factories.py
from ModelA_App.models import ModelA
from ModelA_App.factories import ModelAFactory
class ModelBFactory(factory.django.DjangoModelFactory):
class Meta:
model = ModelB
label = factory.Faker('text')
model_a = factory.LazyAttribute(lambda o: ModelAFactory(type = o.type))
class Params:
type = ModelA.TYPEA
我没有把
ModelAFactory
属性作为LazyAttribute
的一个属性,而是把whole工厂作为一个属性。当您编写子工厂时,您提供的附加定义被锚定到该子工厂。您所写的内容相当于:
类子ModelAFactory(ModelAFactory):
类元:
#不需要-由类继承隐含
model=models.ModelA
type=factory.LazyAttribute(lambda o:“%d”%o.type)
类ModelBFactory(factory.django.DjangoModelFactory):
...
模型a=工厂。子工厂(子模型工厂)
相反,您应该“提高”一个级别,如中所述:
class ModelBFactory(factory.django.DjangoModelFactory):
...
型号a=工厂子工厂(
子模型工厂,
type=factory.LazyAttribute(lambda o:'%d'%o.factory\u parent.type),
#如果无需转换即可传递值,请使用:
type=factory.SelfAttribute(“…type”),
)
这个解决方案有点可行,但您将失去子工厂
的所有好处:共享策略(ModelBFactory.build
/ModelBFactory.create
),在调用时覆盖字段的能力(ModelBFactory(model_a_name='example')
),等等。