"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
函数将在插入/修改对象时被调用。
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
函数将在插入/修改对象时被调用。