【问题标题】:Django Factory Boy loop return same valueDjango Factory Boy 循环返回相同的值
【发布时间】:2022-01-21 03:30:53
【问题描述】:

我正在尝试从循环中生成假对象,但总是返回相同的对象

utilities.py:

...
for _ in range(number_objects):
    try:
        element = app_factories.UserFactory()
        print(element)
    except Exception as e:
        print(e)
        print(type(e))
...

factories.py

from faker import Faker
from factory.fuzzy import FuzzyChoice
from factory.django import DjangoModelFactory

fake = Faker(['es-ES'])

class UserFactory(DjangoModelFactory):
  name = fake.name()
  email = '{}@mailcom'.format(slugify(name))
  height = fake.numerify(text='1##')
  friend = FuzzyChoice(app_models.User.objects.all())

  class Meta:
    model = app_models.User

可能来自种子或生成器,但我不知道如何解决。 任何人都可以帮助我吗? 提前致谢。

【问题讨论】:

    标签: django faker factory-boy


    【解决方案1】:

    问题是对faker 的调用是在模块导入时进行评估的。

    你写的相当于:

    fake = Faker(['es-ES'])
    name = fake.name()  # "John Doe"
    email = '{}@mailcom'.format(slugify(name))  # 'johndoe@mailcom'
    height = fake.numerify(text='1##')  # 123
    friend = FuzzyChoice(app_models.User.objects.all())  # Lazy
    
    class UserFactory(DjangoModelFactory):
      ...
      name = "John Doe"
      email = 'johndoe@mailcom'
      height = 123
      friend = FuzzyChoice(app_models.User.objects.all())
    

    改为:

    class UserFactory(DjangoModelFactory):
      ...
      name = factory.Faker("name")
      email = factory.LazyAttribute(lambda o: '{}@mailcom'.format(slugify(o.name)))
    

    你会在我的回答中找到关于你的代码和使用 FactoryBoy 的助手之间区别的更详细的解释:Django Tests - User Factory with create_batch

    【讨论】:

    • 你能把所有代码分享给我吗?
    猜你喜欢
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多