我认为时区管理被添加到django 1.4中,所以这个问题很新。
我使用了一个简单的模型
class Sample(models.Model):
...
date_generated = models.DateTimeField(auto_now_add = True)
当我尝试检索新创建的记录时,它失败了。
min_datetime = datetime.now() - timedelta(seconds = 300)
sample = Sample.objects.get(date_generated__gte = min_datetime)
并且服务器发出警告。
DateTimeField received a naive datetime (2012-06-29 15:02:15.074000) while time zone support is active.
我找到了解决这个问题的两种方法。
在settings.py中禁用时区管理
USE_TZ = False
但这并不总是令人满意。
改变
date_generated = models.DateTimeField(auto_now_add = True)
到
date_generated = models.DateTimeField(default=datetime.now())
是保持时区管理工作的解决方案
答案 0 :(得分:21)
问题出在你的最后:datetime.now()
不是TZ意识到的,所以你是一个天真的TZ喂养的人。请参阅Django docs on this issue。设置default=datetime.now
时它起作用的原因是你将值强制为一个天真的日期时间,所以当你稍后将它与另一个天真的日期时间进行比较时,没有问题。
你需要通过以下方式获得“现在”:
import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
答案 1 :(得分:18)
使用django的时区工具
from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)
答案 2 :(得分:9)
小心设置DateTimeField
默认值datetime.now()
,因为当Apache / nginx加载Django时(或启动开发服务器时)将计算单个值,并且所有后续记录都将收到那个价值。
出于这个原因,始终使用auto_now_add
。
答案 3 :(得分:-1)
在您的Django模型中:
从settings.py
导入TIME_ZONE
date_field = models.DateTimeField(default=datetime.now(pytz.timezone(TIME_ZONE)))