"提供固定的默认值"升级到Django 1.8之后

时间:2015-04-09 21:43:04

标签: django django-1.8

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 ”。但这不是暗示所说的......那么那旗是什么?

3 个答案:

答案 0 :(得分:63)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

您所要做的就是使用

my_date = DateField(default=datetime.now)

代替

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

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