我有下面的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


当前回答

当类实例化时,Datetime.now()只计算一次。尝试删除圆括号,以便函数datetime. xml返回now,然后求值。我在为我的DateTimeFields设置默认值时遇到了同样的问题,并在这里写下了我的解决方案。

其他回答

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

在执行函数定义时计算默认参数值。这意味着在定义函数时,表达式只计算一次,并且每次调用都使用相同的“预计算”值。

幸运的是,Django有办法做你想做的事情,如果你使用DateTimeField的auto_now参数:

date = models.DateTimeField(auto_now=True)

查看Django文档中的DateTimeField。

如果你只需要DateField,试试这个

date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)

如果你需要日期和时间,试试这个

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

来自django模型默认字段的文档:

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

因此,以下几点应该起作用:

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

在Django 3.0中,auto_now_add似乎与auto_now一起工作

reg_date = models.DateField (auto_now = True,空白= True)

它看起来像是在定义模型时计算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的模型字段参考中找到