码迷,mamicode.com
首页 > 数据库 > 详细

Django(博客系统):按照时间分层筛选“/blog/article/?create_time__year=2017”,出现问题:Database returned an invalid datetime value. Are time zone definitions for your database installed?

时间:2017-09-27 16:16:40      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:分享   cti   获取   没有   image   settings   ima   技术   zip   

问题背景

添加文章时间没问题,但为了设定博客文章按照时间分层筛选(创建时间的年份、年月&月份来搜索文章),我在blog这个django app的admin.py的ArticleAdmin类中做了如下设置:

date_hierarchy = create_time                      # 详细时间分层筛选

models.Article中create_time定义如下:

create_time = models.DateTimeField(u创建时间, auto_now_add=True)

设置后,后台呈现效果:

技术分享

按照时间按分层筛选时,出现了错误:

ValueError at /admin/blog/article/
Database returned an invalid datetime value. Are time zone definitions for your database installed?
Request Method:    GET
Request URL:    http://127.0.0.1:8800/admin/blog/article/?create_time__year=2017
Django Version:    1.11.5
Exception Type:    ValueError
Exception Value:    
Database returned an invalid datetime value. Are time zone definitions for your database installed?
Exception Location:    C:\Python27\lib\site-packages\django\db\models\functions\datetime.py in convert_value, line 198
Python Executable:    C:\Python27\python.exe
Python Version:    2.7.13
Python Path:    
[E:\\Work\\django\\myblog\\apps,
 E:\\Work\\django\\myblog,
 E:\\Work\\django\\myblog,
 E:\\Work\\django\\myblog\\apps,
 C:\\Windows\\system32\\python27.zip,
 C:\\Program Files\\VisualSVN Server\\bin,
 C:\\Program Files\\VisualSVN Server\\PythonPackages,
 C:\\Python27\\DLLs,
 C:\\Python27\\lib,
 C:\\Python27\\lib\\plat-win,
 C:\\Python27\\lib\\lib-tk,
 C:\\Python27,
 C:\\Python27\\lib\\site-packages]
Server time:    星期三, 27 九月 2017 15:01:23 +0800

问题解决方案

首先需要确认数据的时区设置没有问题,这里使用的是mysql数据库,时区设置如下(都是依赖计算机系统的时区):

mysql> show variables like %time_zone%;
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.01 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2017-09-27 14:59:19 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql>

其次,修改django project下的settings.py中市区配置信息:

# LANGUAGE_CODE = en-us
# TIME_ZONE = UTC
LANGUAGE_CODE = zh-hans
TIME_ZONE = Asia/Shanghai

USE_I18N = True

USE_L10N = True

#USE_TZ = True
USE_TZ = False

备注:

1)为了汉化设置了本地语言编码为LANGUAGE_CODE=‘zh-hans’,注意我这里是django1.11.1版本,如果是django1.8之前的版本不是这么设置了的而是LANGUAGE_CODE = ‘zh-cn‘

2)时区默认设置是‘UTC’,我这里为了和本地一样我设置为‘Asia/Shanghai’

3)默认USE_TZ=True,这也是问题的关键,直接修改为USE_TZ=False

 使用USE_TZ = True,需要注意问题:

参考:http://blog.csdn.net/w6299702/article/details/38782607

启用 USE_TZ = True 后,处理时间方面,有两条 “黄金法则”:

  1. 保证存储到数据库中的是 UTC 时间;
  2. 在函数之间传递时间参数时,确保时间已经转换成 UTC 时间;

比如,通常获取当前时间用的是:

import datetime
now = datetime.datetime.now()

启用 USE_TZ = True 后,需要写成:

import datetime 
from django.utils.timezone import utc
utcnow = datetime.datetime.utcnow().replace(tzinfo=utc)

模板

除非应用支持用户设置自己所在的时区,通常我们不需要关心模板的时区问题。模板在展示时间的时候,会使用 settings.TIME_ZONE 中的设置自动把 UTC 时间转成 settings.TIME_ZONE 所在时区的时间渲染。

TIME_ZONE = Asia/Shanghai

 

Django(博客系统):按照时间分层筛选“/blog/article/?create_time__year=2017”,出现问题:Database returned an invalid datetime value. Are time zone definitions for your database installed?

标签:分享   cti   获取   没有   image   settings   ima   技术   zip   

原文地址:http://www.cnblogs.com/yy3b2007com/p/7601940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!