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