我刚刚开始在 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")
但在我的实际用例中,我有几个依赖项和层次结构级别,以这种方式提供额外的冗余参数很麻烦——而且我似乎无法获得正确的参数组合。)
谢谢!