我有下面的db模型:
from datetime import datetime
class TermPayment(models.Model):
# I have excluded fields that are irrelevant to the question
date = models.DateTimeField(default=datetime.now(), blank=True)
我添加了一个新的实例,使用如下:
tp = TermPayment.objects.create(**kwargs)
我的问题:数据库中的所有记录在date字段中都有相同的值,这是第一次付款的日期。服务器重新启动后,一条记录具有新的日期,其他记录与第一条记录相同。看起来好像缓存了一些数据,但我找不到哪里。
数据库:mysql 5.1.25
django v1.1.1
这个问题的答案其实是错误的。
自动填充值(auto_now/auto_now_add与默认值不同)。默认值实际上是用户看到的,如果它是一个全新的对象。我通常做的是:
date = models.DateTimeField(default=datetime.now, editable=False,)
请确保,如果您试图在管理页面中表示这一点,您将其列为“read_only”并引用字段名称
read_only = 'date'
同样,我这样做是因为我的默认值通常是不可编辑的,而且Admin页面会忽略不可编辑的内容,除非另有指定。当然,设置默认值和实现auto_add之间是有区别的,这是这里的关键。测试一下吧!
它看起来像是在定义模型时计算datetime.now(),而不是在每次添加记录时计算。
Django有一个特性可以完成你正在尝试做的事情:
date = models.DateTimeField(auto_now_add=True, blank=True)
or
date = models.DateTimeField(default=datetime.now, blank=True)
第二个例子和当前例子的不同之处在于没有括号。通过传递datetime。现在没有括号,您传递的是实际的函数,每次添加记录时都会调用该函数。如果将datetime.now()传递给它,则只是对函数求值并将返回值传递给它。
更多信息可以在Django的模型字段参考中找到