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

时间:2015-04-19 17:18:21

标签: python django datetime uwsgi

我的模型中有这个代码:

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
)

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

2 个答案:

答案 0 :(得分:21)

在模型的解析/编译时评估

default=datetime.datetime.now()。事后不会改变。要在添加/更新对象时评估now(),您必须使用:

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

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

不要失望,这是一个common错误。

答案 1 :(得分:5)

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

请参阅Django documentation以获得更详尽的解释。

如果使用Django的时区支持,请记住使用django.utils.timezone.now代替datetime.datetime.now