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