模型中的 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的错误。
我的模型中有这段代码:
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的错误。