2013-12-23 35 views
0

我有两个模型,它们都有一个默认为当前日期的日期字段,无论这可能是什么。今天有人指出他们从其中一个人得到了一个错误,那就是将日期设置为12月19日而不是12月23日(今天是撰写本文时)。在django模型中使用默认日期的正确方法

我曾想过两个字段的设置都是一样的,所以我检查了两者之间的意外差异并找到了一个。但我感到很惊讶,因为那个“工作”的人就是那个看上去像是有错误的人。这些字段设置如下:

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

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

我一直认为需要被调用,以确保没有缓存的值today功能。事实正相反吗?有人可以解释这两个模型实例的创建过程是如何解释的吗?

回答

4

第一字段:

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

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

另一种:

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

执行功能datetime.date.today,这在那一刻返回的日期值。所以当Django初始化模型时,它会将默认值设置为该时刻的日期。这个默认值将被使用,直到Django再次重新初始化模型,这通常只在启动时。

0

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

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