django - 如何解决factory_boy SubFactory调用中的CyclicDefinitionError?

标签 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.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

我希望能够使用具有 TYPEBModelA 创建 ModelB 对象。 尝试行 ModelBFactory.create(type = ModelA.TYPEB) 结果错误:

factory.errors.CyclicDefinitionError: Cyclic lazy attribute definition for 'type'; cycle found in ['type']

此外,当我将 Params 类中的 type 名称更改为例如model_type 具有:

model_a = SubFactory(ModelAFactory, type = factory.LazyAttribute(lambda o: '%d' % o.model_type))

失败了

AttributeError: The parameter 'model_type' is unknown.

我怎样才能实现我的目标?

最佳答案

当您编写SubFactory时,您提供的附加定义将锚定到该子工厂。您所写的内容相当于:

class SubModelAFactory(ModelAFactory):
    class Meta:
        # Not required - implied by class inheritance
        model = models.ModelA

    type = factory.LazyAttribute(lambda o: '%d' % o.type)

class ModelBFactory(factory.django.DjangoModelFactory):
    ...
    model_a = factory.SubFactory(SubModelFactory)

相反,您应该“上升”一个级别,如 the SelfAttribute docs 中所述。 :

class ModelBFactory(factory.django.DjangoModelFactory):
    ...
    model_a = factory.SubFactory(
        SubModelFactory,
        type=factory.LazyAttribute(lambda o: '%d' % o.factory_parent.type),

        # If the value can be passed without conversion, use:
        type=factory.SelfAttribute('..type'),
    )

关于django - 如何解决factory_boy SubFactory调用中的CyclicDefinitionError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63012243/

相关文章:

django - haystack Elasticsearch 连接被拒绝

Django 多对多 friend 关系

Django 属性错误 : 'module' object has no attribute 'SubfieldBase'

python - Django Factoryboy 在用作默认参数值时失败

django - 用于非数据库领域的 django 中的工厂男孩

python - django 不会从 statifiles_dirs 加载静态文件

python - 没有这样的表 : social_auth_usersocialauth

python - Django/unittest 在测试运行程序末尾运行命令

django - 如何通过表在工厂男孩中设置动态多对多?

Django:如何在 Factory Boy 工厂和序列化程序中正确使用 ManyToManyField?