Django:model对象保存时datetime.now()时间不一致

3 投票
3 回答
8119 浏览
提问于 2025-04-17 14:48

这里是图片描述

上面是我在管理界面看到的一个表格,数据是按照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这个选项,但在此之前我想先了解一下为什么会出现这种情况。

3 个回答

1

我觉得这是因为Python的运行环境处理方式的问题,希望有人能再解释一下。你提到的auto_add_now=True应该就是解决办法。

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)
5

auto_now_add 这个方法其实不太好,最好不要用。最好的做法是设置一个默认值:

from django.utils import timezone

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

django.utils.timezone 会根据你的时区设置来存储日期和时间。

注意到 timezone.now 后面没有 (),这是因为我们要把一个可调用的对象传给模型,这样每次保存新实例的时候它才会被调用。如果加上括号,它只会在 models.py 加载的时候被调用一次。这个 问题 详细解释了这个情况。

撰写回答