Django default = datetime.now () в моделях всегда сохраняет одно и то же время после сброса uwsgi

У меня этот код в моей модели:

added_time = models.DateTimeField( default=datetime.datetime.now() ) 

После миграции и перезагрузки uwsgi я получаю первое datetime в MariaDB сейчас, а все следующее – точно так же, как и после сброса uwsgi.

 2015-04-19 16:01:46 2015-04-19 16:01:46 2015-04-19 16:01:46 2015-04-19 16:01:46 

Я исправил это, изменив код на:

 added_time = models.DateTimeField( auto_now_add=True ) 

Хотя я исправил проблему, я не совсем уверен, почему такое поведение было даже такое?

default=datetime.datetime.now() оценивается во время разбора / компиляции модели. После этого он не изменяется. Чтобы оценить now() во время добавления / обновления объекта, вы должны использовать:

default=datetime.datetime.now , который now устанавливается как вызываемый. Django будет вызывать его во время выполнения.

auto_now_add ваше решение использовать auto_now_add корректно (но семантически другое – передача значения по умолчанию будет устанавливать значение каждый раз, когда модель будет сохранена, тогда как auto_now_add делает это только один раз, во время создания).

Не расстраивайтесь, это обычная ошибка.

Вам нужно передать datetime.datetime.now вместо datetime.datetime.now() по умолчанию. В противном случае значение по умолчанию вычисляется при инициализации модели, поэтому вы всегда получаете одно и то же значение после перезапуска.

См. Документацию Django для более подробного объяснения.

Если вы используете поддержку часовых поясов Django, не забудьте использовать django.utils.timezone.now вместо datetime.datetime.now .