Django:模型对象保存中的 datetime.now() 时间不一致

Posted

技术标签:

【中文标题】Django:模型对象保存中的 datetime.now() 时间不一致【英文标题】:Django: datetime.now() time inconsistency in model object save 【发布时间】:2013-01-20 09:08:18 【问题描述】:

以上是我在管理界面中的一张表,按id的降序排列(最近的记录在顶部)。这是我用来创建模型对象并保存的方式。

notification = Notification(from_user=from_user, to_user=to_user,
                            created_date=datetime.now())
notification.save()

此表Notification 的所有插入仅在各种post_save 信号处理程序中完成。会不会造成这样的不一致?

在 django 1.3.2 中使用 TIME_ZONE = 'GMT'。我可以尝试在模型中使用 auto_now_add=True 选项,但在此之前只想知道为什么会这样。

【问题讨论】:

datetime.now() 返回本地时间,所以我可以看到这可能发生的唯一方法是如果不同的请求具有不同的本地时区。这在你的应用程序中可能吗?试试datetime.utcnow()。无论如何,以 UTC 格式存储日期通常是一种好习惯。 +1 表示 UTC 提及。但我相信datetime.now() 返回本地时间(机器时间或TIME_ZONE 中给出的时间)而不是请求时区。所以应该有另一种方式。 你在哪个平台上?有机会吗? 不。在 Ubuntu linux 中。 【参考方案1】:

auto_now_add 不是一个好方法。避免使用它。最好的方法是使用设置默认值:

from django.utils import timezone

date_created = models.DateTimeField(default=timezone.now)

django.utils.timezone 将根据您的时区设置存储日期时间。

请注意timezone.now 之后缺少的(),这是因为我们将可调用对象传递给模型,并且每次保存新实例时都会调用它。使用括号,它只会在models.py 加载时被调用一次。这个question 更详细地阐明了这个问题。

【讨论】:

为什么auto_now_add 不是一个好方法,应该避免吗? 是的,我也想知道。 过去有很多关于 auto_now 和 auto_now_add 的讨论。我将在此处提供一些参考链接,请参阅this 和 this【参考方案2】:

您不应该在定义模型时初始化 datetime.now()。这会导致某种“缓存” datetime.now。

代替:

Notification(from_user=from_user, to_user=to_user,
                            created_date=datetime.now())

你应该使用:

Notification(from_user=from_user, to_user=to_user,
                            created_date=datetime.now)

【讨论】:

【参考方案3】:

我相信这是由于 Python 运行时环境的处理方式,希望有人可以对此进行重新迭代。 auto_add_now=True 应该是您建议的解决方案。

【讨论】:

能否请您发布有关runtime environment process的任何详细信息?

以上是关于Django:模型对象保存中的 datetime.now() 时间不一致的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何让 datetime 对象知道创建它的时区?

在 Django 中获取模型表单的保存对象?

Django 模型没有保存到 Celery Task 中的数据库中

django模型中的自定义保存方法

如何以 django 模型形式覆盖保存方法

在第一次保存对象时使 django 模型字段只读或在管理员中禁用