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文档。