Factory-boy fuzzy DateTimeField всегда имеет одну и ту же дату при использовании create_batch
Я использую factory-boy для создания экземпляров модели Django, и я всегда получаю одно и то же значение, возвращаемое при использовании factory.fuzzy.FuzzyDateTime
.
Минимальный пример:
# factory class
class FooFactory(DjangoModelFactory):
class Meta:
# models.Foo has a dt_field that is a DateTimeField
model = models.Foo
# creation of object, in unit tests
# I can't move the dt_field declaration
# into the factory definition since different
# unit tests use different start / end points
# for the datetime fuzzer
now = datetime.datetime.now(tz=pytz.timezone("America/New_York"))
one_week_ago = now - datetime.timedelta(days=7)
FooFactory.create_batch(
10,
dt_field=factory.fuzzy.FuzzyDateTime(
start_dt=one_week_ago, end_dt=now
)
)
При осмотре моделей Foo после создания фабрики, dt_field
имеет одну и ту же дату:
>>> [r.dt_field for r in Foo.objects.all()]
>>> [datetime.datetime(2022, 12, 10, 20, 15, 31, 954301, tzinfo=<UTC>), datetime.datetime(2022, 12, 10, 20, 15, 31, 961147, tzinfo=<UTC>),
datetime.datetime(2022, 12, 10, 20, 15, 31, 967383, tzinfo=<UTC>), ...]
Основная проблема заключалась в том, что модель в моем коде имела auto_now_add=True
в определении модели. Это внутренняя функция Django, которая всегда переопределяет предоставленное значение и поэтому не может быть использована с factory-boy.
Вместо этого поле auto_now_add
удаляется в пользу default=timezone.now
, и поле может быть корректно запущено с помощью factory-boy.