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.

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