30

我想时区管理已添加到 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

3 回答 3

29

使用 django 的时区工具

from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)
于 2015-09-05T09:33:18.690 回答
23

问题出在你头上:datetime.now()TZ 不知道,所以你是一个在天真的 TZ 中喂养的人。请参阅有关此问题的 Django 文档。设置时它起作用的原因default=datetime.now是您将值强制为天真的日期时间,因此当您稍后将其与另一个天真的日期时间进行比较时,没有问题。

您需要通过以下方式获得“现在”:

import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)
于 2012-06-29T14:31:30.310 回答
9

小心设置DateTimeField默认值datetime.now(),因为这将在 Apache/nginx 加载 Django(或启动开发服务器时)计算单个值,并且所有后续记录都将接收该值。

总是auto_now_add因为这个原因使用。

于 2013-10-21T17:45:32.890 回答