Faker使用Factory Boy创建的所有相等值

问题描述 投票:0回答:3

[在Django项目中使用Factory Boy和Faker,我注意到使用Factory Boy创建的对象并使用Faker创建名称(在此示例中为公司名称)不会为新对象创建唯一名称。

主要问题:在将Faker用作单独的库时,我们是否使用Faker错误(第一个示例),或者与Factory一起使用时,Factory Boy本身是否存在某些固有的问题,无法阻止Faker用作单独的库?男孩?

import factory
...

from faker import Faker
from faker.providers import company
...

fake = Faker('nl_NL')
fake.add_provider(company)


class PolicyBrandFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = PolicyBrand

    name = fake.company()

结果(Pycharm调试器屏幕截图):enter image description here(关键点是非唯一的公司名称)

在Factory Boy文档中,我读到他们在Faker周围有一个包装纸,使用它我得到了独特的结果:

import factory
...


class PolicyBrandFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = PolicyBrand

    name = factory.Faker('company', locale='nl_NL')

结果:enter image description here

django faker factory-boy
3个回答
1
投票

类似于Django表单并设置默认日期,在首次定义类时设置name值。

您需要使用LazyAttribute

LazyAttribute

1
投票

您正在使用类变量。定义类时,将定义name = factory.LazyAttribute(lambda _: fake.company()) ,以单次调用name

的结果
fake.company()

[如果这是一个简单的Django模型,我希望必须重写class PolicyBrandFactory(factory.django.DjangoModelFactory): class Meta: model = PolicyBrand name = fake.company() ,但我对__init__以及它可能执行的元分类魔术一无所知。


0
投票

在factory_boy中使用Faker的受支持方法是通过factory.django.DjangoModelFactory帮助程序:

factory.Faker

这还将把Faker的随机种子管理与factory_boy的随机种子联系起来。

如果您要没有帮助者,则必须使用其中一个懒惰的帮助者:

factory.Faker
© www.soinside.com 2019 - 2024. All rights reserved.