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


当前回答

如果你只需要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)

datetime.now()在创建类时计算,而不是在向数据库添加新记录时计算。

为了达到你想要的效果,将这个字段定义为:

date = models.DateTimeField(auto_now_add=True)

这样,日期字段将被设置为每个新记录的当前日期。

如果你只需要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)

大卫的答案是正确的。括号()使得每次计算模型时都会调用可调用的timezone.now()。如果你从timezone.now()(或datetime.now(),如果使用天真的datetime对象)中删除(),使其变成这样:

default=timezone.now

然后它会像你期望的那样工作: 新对象在创建时将接收当前日期,但不会在每次执行manage.py makemig/ migrate时重写日期。

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

而不是使用datetime。现在你应该使用from django.utils.timezone import了

参考:

django.utils.timezone.now的文档

所以你可以这样做:

from django.utils.timezone import now


created_date = models.DateTimeField(default=now, editable=False)