django - 为什么FactoryBoy从SubFactory创建一个新对象,尽管 FACTORY_DJANGO_GET_OR_CREATE

  显示原文与译文双语对照的内容
0 0

我刚开始使用工厂男孩 Django 。 它有一个设置 FACTORY_DJANGO_GET_OR_CREATE,这意味着它不会创建一个新的对象如果已经存在。 但是当我请求一个现有的对象与现有的SubFactory 对象时,它创建一个未使用的对象,尽管这个设置。

例如在一个全新的项目中,我尝试了:


# models.py
from django.db import models

class A(models.Model):
 name = models.CharField(max_length=10)

class B(models.Model):
 name = models.CharField(max_length=10)
 a = models.ForeignKey(A)


# factories.py
import factory

from. import models

class AFactory(factory.DjangoModelFactory):
 FACTORY_FOR = models.A
 FACTORY_DJANGO_GET_OR_CREATE = ('name',)

 name = factory.Sequence(lambda n: 'A-{0}'.format(n))

class BFactory(factory.DjangoModelFactory):
 FACTORY_FOR = models.B
 FACTORY_DJANGO_GET_OR_CREATE = ('name',)

 name = factory.Sequence(lambda n: 'B-{0}'.format(n))
 a = factory.SubFactory(AFactory)

现在:


from factories import *

a = AFactory(name="Apple")
models.A.objects.all()
# one object
b = BFactory(a__name="Apple", name="Beetle")
models.B.objects.all()
models.A.objects.all()
# one A object, one B object
b = BFactory(name="Beetle")
models.B.objects.all()
models.A.objects.all()
# still one B object, but now a new, unused A object too

最后调用 BFactory 已经创造了一个新的对象类 A, 即使 B 甲虫已经存在( 并没有被创建) 对象名称。 为什么我如何停止创建这个新的对象?

( 我可以通过调用来解决这里问题:


b = BFactory(name="Beetle", a__name="Apple")

但是在我实际的用例中,我有几个依赖关系和层次结构,并且以这种方式提供多余的冗余参数,这是不可能的。

谢谢!

时间: 原作者:

0 0

我相信SubFactory在 get_or_create irrespectively之后启动了。

不确定 s9lution,但它不是我遇到的用例。 遗憾的是,依赖get_or_create的装置有太多的魔力。 如果你有一个复杂的测试用例,可选的( 始终创建) 可能会更繁琐一些,但

原作者:
0 0

上面是一个问题,当我还有一个具有外键的类C 时。 当我创建一个新的CFactory 对象时,如下所示:


c = CFactory(name="Cat", b__name="Beetle")

它还创建了一个新的未使用的A 对象。

我发现这个解决方案很简单: 相反,让新的CFactory 对象如下所示:


c = CFactory(name="Cat", b=b)

其中 bb 对象或者 BFactory 对象。

原作者:
0 0

你可以调用用户:


a = SubFactory(AFactory, name='Reuse this model A instance')

这样,下面两个调用是相等的:


BFactory()
BFactory(a__name='Reuse this model A instance')

...