模型中的 Django default=datetime.now() 在 uwsgi 重置后总是保存相同的日期时间

Django default=datetime.now() in models always saves same datetime after uwsgi reset

我的模型中有这段代码:

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

在我迁移并重新启动 uwsgi 之后,我现在在 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
)

虽然我解决了问题,但我不太确定为什么会出现这种行为?

您需要将 datetime.datetime.now 而不是 datetime.datetime.now() 传递给默认值。否则,默认值是在模型初始化时计算的,因此您在重启后总是得到相同的值。

查看 Django documentation 以获得更详尽的解释。

如果使用 Django 的时区支持,记得使用 django.utils.timezone.now 而不是 datetime.datetime.now

default=datetime.datetime.now() 在模型的 parsing/compile 时间进行评估。之后不会更改。要在对象 adding/updating 时计算 now(),您必须使用:

default=datetime.datetime.now,将 now 设置为可调用。 Django 会在运行时调用它。

您使用 auto_now_add 的解决方案当然也是正确的(但在语义上不同——传递默认值将在每次保存模型时设置该值,而 auto_now_add 只执行一次,在创建时)。

不要灰心,这是一个非常common的错误。