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')
),等等。