首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >django时区如何使用model.field的auto_now_add

django时区如何使用model.field的auto_now_add
EN

Stack Overflow用户
提问于 2012-06-29 21:36:52
回答 4查看 32.2K关注 0票数 30

我想时区管理是被添加到Django 1.4中的,所以这个问题是相当新的。

我用了一个简单的模型

代码语言:javascript
复制
class Sample(models.Model):
    ...
    date_generated = models.DateTimeField(auto_now_add = True)

当我尝试检索一个新创建的记录时,它失败了。

代码语言:javascript
复制
min_datetime = datetime.now() - timedelta(seconds = 300)
sample = Sample.objects.get(date_generated__gte = min_datetime)

服务器发出警告。

代码语言:javascript
复制
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.改变

代码语言:javascript
复制
    date_generated = models.DateTimeField(auto_now_add = True) 

代码语言:javascript
复制
    date_generated = models.DateTimeField(default=datetime.now()) 

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

EN

回答 4

Stack Overflow用户

发布于 2015-09-05 17:33:19

使用django的时区工具

代码语言:javascript
复制
from django.utils import timezone
date_generated = models.DateTimeField(default=timezone.now)
票数 28
EN

Stack Overflow用户

发布于 2012-06-29 22:31:30

问题出在你这一端:datetime.now()不知道TZ,所以你是那个给一个天真的TZ喂食的人。请参阅Django docs on this issue。当设置default=datetime.now时,它起作用的原因是您强制将值设置为一个朴素的日期时间,所以当您稍后将其与另一个朴素的日期时间进行比较时,没有问题。

你需要通过以下方式获取"now“:

代码语言:javascript
复制
import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)
票数 23
EN

Stack Overflow用户

发布于 2013-10-22 01:45:33

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

因此,请始终使用auto_now_add

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11262828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档