報錯解決——DateTimeField *** received a naive datetime (***) while time zone support is active

  這是一個跟時區有關的問題,報錯中說到datetime字段獲得一個naive datetime,而不是支持time zone的active datetime
因爲Django的設置中米哦人USE_TZ設置爲True,Django會自動根據所設的時區對時間進行轉換,因此程序中和數據保存的時間都轉UTC時間,只有模版渲染時會把時間轉爲TIME_ZONE所設置的時區的時間。django

  使用datetime.datetime.utcnow()輸出的是不帶時區的utc時間,稱爲naive timespa

rom datetime import datetime 
datetime.now() 
datetime.datetime(2016, 06, 19, 07, 14, 55, 865000)

 

  使用django.utils.timezone.now()輸出的是帶時區的utc時間,稱爲active timecode

from django.utils import timezone
timezone.now()
datetime.datetime(2016, 06, 19, 07, 15, 48, 367000, tzinfo=<UTC>)

 

  若是項目須要根據時區顯示時間,那就使用Django的timezone.now()。不須要的話將USE_TZ設置爲False便可。blog

  使用帶時區的時間,將全部用到datetime.now()的地方改成timezone.now(),並在對應的文件頂部加上from django.utils import timezone,就OK了。class

  若是項目中已經有了不少datetime.now(),又不想大面積改動的話,能夠將import的語句修改一下import

# from datetime import datetime # 原來用的註釋掉
from django.utils import timezone as datetime # 不想大面積修改就這麼作
相關文章
相關標籤/搜索