我想时区管理被添加到django 1.4,所以这个问题很新.
我用了一个简单的模型
class Sample(models.Model):
...
date_generated = models.DateTimeField(auto_now_add = True)
Run Code Online (Sandbox Code Playgroud)
当我尝试检索新创建的记录时,它失败了.
min_datetime = datetime.now() - timedelta(seconds = 300)
sample = Sample.objects.get(date_generated__gte = min_datetime)
Run Code Online (Sandbox Code Playgroud)
并且服务器发出警告.
DateTimeField received a naive datetime (2012-06-29 15:02:15.074000) while time zone support is active.
Run Code Online (Sandbox Code Playgroud)
我找到了解决这个问题的两个方案.
在settings.py中禁用时区管理
USE_TZ = False
Run Code Online (Sandbox Code Playgroud)
但这并不总是令人满意的.
改变
date_generated = models.DateTimeField(auto_now_add = True)
Run Code Online (Sandbox Code Playgroud)
至
date_generated = models.DateTimeField(default=datetime.now())
Run Code Online (Sandbox Code Playgroud)
是时区管理工作的解决方案
Chr*_*att 22
问题出在你的最后:datetime.now()
不是TZ意识到的,所以你是一个天真的TZ喂养的人.请参阅有关此问题的Django文档.设置时它起作用的原因default=datetime.now
是你将值强制为一个天真的日期时间,所以当你稍后将它与另一个天真的日期时间进行比较时,没有问题.
你需要通过以下方式获得"现在":
import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
Run Code Online (Sandbox Code Playgroud)
小智 19
使用django的timezone utils
from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)
小心设置DateTimeField
默认值datetime.now()
,因为当Apache/nginx加载Django时(或启动开发服务器时)将计算单个值,并且所有后续记录将接收该值.
总是因此而使用auto_now_add
.