gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:18:31 27 4
gpt4 key购买 nike

我刚开始使用factory boy与 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名为 Beetle 的对象已经存在(并且没有重新创建)。为什么,以及如何停止创建这个新的 A 对象?

(我知道我可以通过调用来解决这个问题:
b = BFactory(name="Beetle", a__name="Apple")

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

谢谢!

最佳答案

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

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

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

我发现解决方案很简单:改为创建新的 CFactory像这样的对象:
c = CFactory(name="Cat", b=b)

在哪里 bB对象或 BFactory目的。

关于django - 尽管 FACTORY_DJANGO_GET_OR_CREATE,为什么 FactoryBoy 从 SubFactory 创建一个新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17206677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com