django时区如何使用model.field';s自动\u现在\u添加
我想Django1.4中添加了时区管理,所以这个问题是非常新的 我用了一个简单的模型django时区如何使用model.field';s自动\u现在\u添加,django,timezone,Django,Timezone,我想Django1.4中添加了时区管理,所以这个问题是非常新的 我用了一个简单的模型 class Sample(models.Model): ... date_generated = models.DateTimeField(auto_now_add = True) 当我试图检索新创建的记录时,它失败了 min_datetime = datetime.now() - timedelta(seconds = 300) sample = Sample.objects.get(dat
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.
我想出了两个解决这个问题的办法
USE_TZ = False
date_generated = models.DateTimeField(auto_now_add = True)
到
是让时区管理正常工作的解决方案吗?问题出在你这边:
datetime.now()
不知道TZ,所以你是一个天真的TZ的喂养者。看。设置default=datetime.now
时它起作用的原因是您强制将该值设置为一个朴素的datetime,因此当您稍后将其与另一个朴素的datetime进行比较时,没有问题
您需要通过以下方式获得“立即”:
import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
小心设置
datetime.now()
的默认值datetime.now()
,因为这将在Apache/nginx加载Django(或启动开发服务器时)时计算单个值,所有后续记录都将接收该值
因此,请务必立即使用自动添加。使用django的时区UTIL
from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)
在django模型中:
从settings.py导入时区
date\u field=models.DateTimeField(默认值=datetime.now(pytz.timezone(TIME\u ZONE))
这是否意味着如果我已经使用了\u TZ=True,我就不能使用auto\u now\u add?似乎auto\u now
固有地使用datetime.now
。Django在Django中插入TZ感知设施似乎是一个奇怪的疏忽,但却错过了这个相当重要的设施,但这两个Kwarg的命运已经争论了很长时间。我的理由是,他们被留在向后兼容(并避免推回),但不要期望他们得到任何爱。只要用utcnow
设置default
kwarg,如果你想知道TZ的日期时间,就不用担心auto\u now
或auto\u now\u add
。谢谢Chris。我不认为“默认值”可以取代“现在自动”,因为后者总是更新每次保存的时间,而“默认值”只是在字段没有值的情况下。获得“现在”的更快方法<代码>从django.utils.timezone导入,现在为utcnow
now=utcnow()
将为您提供与@ChrisPratt give.django 1.4.5显示auto_now或auto_now_add使用时区相同的结果。now(),而不是datetime.now(),因此使用它们是安全的。只需使用default=datetime.now
而不带括号。对于查看此线程的其他人:注意答案是如何说now
而不是now()
。第二个将在加载服务器时计算,这不是您想要的。这将在django加载时计算,并且不再更新
from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)