首页 > 解决方案 > Faker 使用 Factory Boy 创建的所有相等值

问题描述

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

主要问题:我们在将 Faker 用作单独的库(第一个示例)时使用它是错误的,还是 Factory Boy 的某些固有特性阻止了 Faker 在与 Factory Boy 一起使用时作为单独的库正常工作?

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 调试器屏幕截图):( 在此处输入图像描述 重点是非唯一的公司名称)

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

import factory
...


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

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

结果: 在此处输入图像描述

标签: djangofakerfactory-boy

解决方案


与 Django 表单和设置默认日期类似,该name值是在首次定义类时设置的。

你需要使用LazyAttribute

name = factory.LazyAttribute(lambda _: fake.company())

推荐阅读