【问题标题】:All equal values created by Faker using Factory BoyFaker 使用 Factory Boy 创建的所有相等值
【发布时间】:2020-04-09 19:43:29
【问题描述】:

在 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')

结果:

【问题讨论】:

    标签: django faker factory-boy


    【解决方案1】:

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

    你需要使用LazyAttribute

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

    【讨论】:

    • 天哪,我自己都没有意识到这一点。我猜又要回学校了,谢谢!
    【解决方案2】:

    您正在使用类变量。 name 是在定义类时定义的,是对 fake.company() 的单次调用的结果

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

    如果这是一个简单的 Django 模型,我希望必须覆盖 __init__,但我对 factory.django.DjangoModelFactory 以及它可能执行的元分类魔法一无所知。

    【讨论】:

      【解决方案3】:

      在 factory_boy 中支持使用 Faker 的方式是通过 factory.Faker 助手:

      class PolicyBrandFactory(factory.django.DjangoModelFactory):
          class Meta:
              model = PolicyBrand
      
          name = factory.Faker('company', locale='nl_NL')
      

      这也将 Faker 的随机种子管理连接到 factory_boy 的随机种子。

      如果你想不用助手,你必须使用惰性助手之一:

      fake = Faker('nl_NL')
      
      class PolicyBrandFactory(factory.django.DjangoModelFactory):
          class Meta:
              model = PolicyBrand
      
          name = factory.LazyFunction(fake.company)
          name_alt = factory.LazyAttribute(lambda obj: fake.company())
      
      

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 2021-08-23
        • 2018-02-16
        • 2018-05-08
        • 2017-12-17
        • 2019-03-31
        • 2015-12-26
        • 1970-01-01
        • 2020-05-03
        相关资源
        最近更新 更多