在django模型中使用默认日期的正确方法

时间:2013-12-23 10:39:49

标签: python django date

我有两个模型,两个模型都有一个日期字段默认为当前日期,无论可能是什么。今天有人指出他们从其中一个人那里得到了错误,其中的日期是12月19日而不是12月23日(今天写作时)。

我原以为这两个字段的设置完全一样,所以我检查了两者之间的意外差异并找到了一个。但我感到很惊讶,因为“工作”一个是那个看起来像是包含错误的人。字段设置如下:

# Working field
date_stamp = models.DateField(default=datetime.date.today)

# Broken field
date_statp = models.DateField(default=datetime.date.today())

我一直认为需要调用today函数来确保没有缓存值。反过来实际上是正确的吗?有人可以解释如何在模型实例创建中实际解释这两个吗?

2 个答案:

答案 0 :(得分:4)

第一个字段:

date_stamp = models.DateField(default=datetime.date.today)

将回调作为默认值。这意味着每次需要填充默认值时都会调用该函数。

另一个:

date_statp = models.DateField(default=datetime.date.today())

执行函数datetime.date.today,该函数返回当时日期的值。因此,当Django初始化模型时,它会将默认值设置为该精确时刻的日期。将使用此默认值,直到Django再次重新初始化模型,这通常仅在启动时。

答案 1 :(得分:0)

首次导入模块时会运行类定义,然后执行datetime.data.today()调用。因此,它在Django基本启动时运行,并且在第一次导入后不会更改。

如果没有引号,则将默认值设置为函数对象,即可调用对象。当Django创建一个新实例,并且默认值是可调用的时,Django会调用它并使用返回值作为默认值。这就是你想要的 - 没有引号。