5

我刚刚开始在 Django 中使用factory boy。它有一个设置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产生了一个新的 class 对象A,即使B名为 Beetle 的对象已经存在(并且没有重新创建)。为什么,以及如何停止创建这个新的 A 对象?

(我知道我可以通过调用来解决这个问题:

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

但在我的实际用例中,我有几个依赖项和层次结构级别,以这种方式提供额外的冗余参数很麻烦——而且我似乎无法获得正确的参数组合。)

谢谢!

4

3 回答 3

1

当我也有一个具有 B 外键的类 C 时,上面是一个问题。当我CFactory像这样创建一个新对象时:

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

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

我发现解决方案很简单:相反,CFactory像这样制作新对象:

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

whereb是一个B对象或一个BFactory对象。

于 2013-07-05T21:40:31.667 回答
1

你可以调用使用:

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

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

BFactory()
BFactory(a__name='Reuse this model A instance')
于 2014-06-06T13:23:09.537 回答
0

我相信子工厂会在 get_or_create 之后启动。

虽然不确定 s9lution,但这不是我遇到的用例。恕我直言,依赖 get_or_create 的装置有太多的魔法潜力。如果您有一个复杂的测试用例,替代方案(总是创建)可能会更乏味,但更安全

于 2013-06-20T12:04:14.220 回答