django时区如何使用model.field';s自动\u现在\u添加

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

我想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(date_generated__gte = min_datetime)
服务器发出警告

DateTimeField received a naive DateTime (2012-06-29 15:02:15.074000) while time zone support is active.
我想出了两个解决这个问题的办法

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

     USE_TZ = False 
    
  • 但这并不总是可取的。 2.改变

        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)