gpt4 book ai didi

python - 带有 SubFactory 字段的 DjangoModelFactory 不创建新条目而是指向现有条目

转载 作者:行者123 更新时间:2023-12-02 00:48:55 25 4
gpt4 key购买 nike

假设我有:

class CompanyFactory(DjangoModelFactory):

class Meta:
model = Company

name = factory.Faker("company")
address = factory.Faker("address")


class InvoiceFactory(DjangoModelFactory):

class Meta:
model = Invoice

company = factory.SubFactory(CompanyFactory)
num = factory.Faker("numerify", text="#"*10)
value_total = factory.Faker("random_number", digits=3)

当我运行 InvoiceFactory.create() 方法时,会创建一个新的发票条目。并且由于 Invoice“链接”(外键)到 Company,因此还会创建一个新的 Company 条目。


问题:

重写此代码的正确方法是什么,以便在调用 InvoiceFactory.create() 时选择现有公司条目,而不是创建新条目?

最佳答案

你有两个选择:

始终选择现有公司:

class InvoiceFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Invoice
company = factory.Iterator(models.Company.objects.all())

当创建第一个发票时,迭代器被延迟计算。但是,它将始终循环通过相同的工厂。

创建一些公司,然后重用:

首先,将django_get_or_create 属性添加到您的CompanyFactory:如果提供的name 已存在于数据库中,现有实例将被重用:

class CompanyFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Company
django_get_or_create = ['name']
name = factory.Faker('company')
address = factory.Faker('address')

然后,从常量列表中为 name 字段提供值(此处使用 factory.fuzzy.FuzzyChoice):

class InvoiceFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Invoice
company = factory.SubFactory(
CompanyFactory,
name=factory.fuzzy.FuzzyChoice(['PSF', 'Django', 'The Spanish Inquisition']),
)

创建前 3 个公司后,它们将被重新用于所有后续对象。

关于python - 带有 SubFactory 字段的 DjangoModelFactory 不创建新条目而是指向现有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59226608/

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