"Fixed default value provided" 升级到 Django 1.8 后

"Fixed default value provided" after upgrading to Django 1.8

Django 1.8 现在对模型进行了一些问题检测,这很好。但是,对于它给我的一个警告,我理解问题所在,但我不明白它给我的提示如何更好。

这是我的(错误的)模型字段:

my_date = DateField(default=datetime.now())

很容易看出为什么这很糟糕。但这是它给我的提示:

MyMoel.my_date: (fields.W161) Fixed default value provided.
    HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`

所以,它说使用 timezone.now,但它比 datetime.now 好在哪里?它们都是 "fixed default" 值... timezone.now 只是 returns 一个日期时间实例,它是固定值...

我怀疑它实际上是想让我插入某种标志 "use timezone.now later"。但这不是提示所说的...那么那个标志是什么?

函数 datetime.now() 当前在您的代码被导入后立即执行,即当您(重新)启动您的服务器时。所有后续模型实例都将具有相同的值。

相反,您应该将可调用函数传递给 default,每次模型实例需要默认值时都会执行该函数。该提示想要传达的是,您应该按字面意思使用 DateField(default=django.utils.timezone.now) 而不带括号。

该消息有点误导,但 Django 不知道您使用的是 datetime.now() 还是 django.utils.timezone.now()

完全同意@knbk

在我的实现中,我先导入了

我的models.py:

from django.utils import timezone

然后,在创建模型时,我这样做了:

create_date = models.DateTimeField(default=timezone.now)

所以总代码是:

from django.db import models
from django.utils import timezone
from django.urls import reverse

# Create your models here.

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    create_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True,null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def approve_comments(self):
        return self.comments.filter(approve_comments=True)

    def __str__(self):
        return self.title

timezone.now()datetime.now()的区别,上面的回答已经很好的解释了。 但是,您收到错误的原因是因为您 运行 将默认时间设置为将迁移应用到数据库时的时间的函数。

你所要做的就是使用,

my_date = DateField(default=datetime.now)

而不是

my_date = DateField(default=datetime.now())

在上述方法中,timezone.now函数将在插入/修改对象时被调用。