django时区如何与model.field的auto_now_add一起使用

时间:2012-06-29 13:36:52

标签: django timezone

我认为时区管理被添加到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.

我找到了解决这个问题的两种方法。

  1. 在settings.py中禁用时区管理

    USE_TZ = False 
    

    但这并不总是令人满意。

  2. 改变

    date_generated = models.DateTimeField(auto_now_add = True) 
    

    date_generated = models.DateTimeField(default=datetime.now()) 
    

    是保持时区管理工作的解决方案

4 个答案:

答案 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)))