38

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

这是我的(坏)模型字段:

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

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

MyMoel.my_date:(fields.W161)提供的固定默认值。
    提示:您似乎为此字段设置了一个固定的日期/时间/日期时间值作为默认值。这可能不是你想要的。如果您想将当前日期设为默认日期,请使用 `django.utils.timezone.now`

所以,它说要使用timezone.now,但那有什么比这更好的datetime.now呢?它们都是“固定默认”值......timezone.now返回一个日期时间实例,它是一个固定值......

我怀疑它实际上是想让我插入某种“timezone.now 稍后使用”的标志。但这不是提示所说的......那么那个标志是什么?

4

3 回答 3

94

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

相反,您应该将可调用函数传递给default,每次模型实例需要默认值时都会执行该函数。提示想要传达您应该DateField(default=django.utils.timezone.now)在没有括号的情况下直接使用。

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

于 2015-04-09T21:48:58.010 回答
3

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

你所要做的就是使用,

my_date = DateField(default=datetime.now)

代替

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

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

于 2020-12-10T16:37:27.710 回答
1

完全同意@knbk

在我的实施中,我首先进行了导入

我的模型.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
于 2020-05-25T13:45:47.410 回答