Django Factory Boy loop возвращает одно и то же значение

Я пытаюсь генерировать поддельные объекты из цикла, но всегда возвращается один и тот же объект

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

Возможно, это происходит из-за семян или генератора, но я не знаю, как это решить. Кто-нибудь может помочь мне, пожалуйста? Заранее спасибо.

Проблема в том, что вызовы 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 - Пользовательская фабрика с create_batch

Вернуться на верх