Djangodate时间问题(默认= datetime.now())

我有这样的数据库模型:

from datetime import datetime class TermPayment(models.Model): # cut out some fields, non relevant to the question date = models.DateTimeField(default=datetime.now(), blank=True) 

而且当新实例添加时:

 tp = TermPayment.objects.create(**kwargs) 

我有一个问题:数据库中的所有logging在date字段中具有相同的值 – 第一次付款的date。 服务器重新启动后 – 一个logging有新的date,其他logging与第一个logging相同。 它看起来像一些数据caching使用,但我无法find在哪里。

数据库:mysql 5.1.25

django v1.1.1

它看起来像datetime.now()正在计算模型定义时,而不是每次添加logging。

Django有一个function来完成你正在尝试做的事情:

 date = models.DateTimeField(auto_now_add=True, blank=True) 

要么

 date = models.DateTimeField(default=datetime.now, blank=True) 

第二个例子和你现在有的区别是缺less括号。 通过传递datetime.now没有括号,你传递的实际function,这将被称为每次添加logging。 如果你通过它datetime.now() ,那么你只是评估函数,并传递它的返回值。

更多信息可以在Django的模型字段参考中find

而不是使用datetime.now你应该真正使用from django.utils.timezone import now

参考:

  • django.utils.timezone.now文档

从django模型默认字段的文档 :

该字段的默认值。 这可以是一个值或一个可调用的对象。 如果可调用,则每次创build新对象时都会调用它。

所以下面应该工作:

 date = models.DateTimeField(default=datetime.now,blank=True) 

datetime.now()是在创build类时计算的,而不是在将新logging添加到数据库时计算的。

要达到你想要的定义这个领域:

 date = models.DateTimeField(auto_now_add=True) 

这样date字段将被设置为每个新logging的当前date。

大卫有正确的答案。 括号()使得可调用的 timezone.now()在每次模型评估时被调用。 如果从timezone.now()(或datetime.now())中删除(),如果使用朴素的date时间对象)

 default=timezone.now 

那么它会按照你的预期工作:
新对象将在创build时接收当前date,但每次执行manage.py makemigrations / migrate时都不会覆盖date。

我刚刚遇到这个。 非常感谢大卫。

这个答案其实是错的。

自动填充值(auto_now / auto_now_add与默认值不同)。 默认值实际上是用户所看到的,如果它是一个全新的对象。 我通常做的是:

 date = models.DateTimeField(default=datetime.now, editable=False,) 

请确保,如果您试图在pipe理页面中表示此名称,请将其列为“read_only”并引用字段名称

 read_only = 'date' 

再一次,我这样做,因为我的默认值通常不可编辑,pipe理页面忽略不可编辑,除非另有规定。 然而,在设置默认值和实现这里的关键字auto_add之间肯定有区别。 testing一下!

datetime.now()正在被评估一次,当你的类被实例化。 尝试删除括号,以便datetime.now函数返回,然后评估。 我为我的DateTimeField设置默认值时遇到同样的问题,并在这里写下我的解决scheme。

从Python语言参考中,在函数定义下 :

当函数定义被执行时,默认参数值被评估。 这意味着expression式被计算一次,当函数被定义时,并且每个调用使用相同的“预计算”值。

幸运的是,如果您为DateTimeField使用auto_now参数,那么Django有办法做到您想要的:

 date = models.DateTimeField(auto_now=True) 

查看DateTimeField的Django文档。