首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django2中DateTime字段查询时QuerySet为空的解决方案

Django2项目中,如果启用了时区设置,并且使用Mysql数据库时,对Datetime字段进行查询时,可能出现QuerySet数据为空的问题。

这里说一下问题出现与解决的经过。

最近开发的一个项目,在Django中配置了时区。

“settings.py”中相关配置如下:

TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = True

然后,当在项目中对MySQL数据库查询时出现了问题。

查询语句如下:

上面的代码,是想要从数据库中查询出创建时间中的日期部分为某一天的订单数据,但是查询结果的QuerySet是空的。

在Django中我们可以使用“__day”对DateTime字段进行日期匹配,这种匹配规则大家可以参考“Web项目开发入门笔记(8)”。

上面的语句代码并没有问题,那为什么没有正常取得数据呢?

这里要注意一点,Django中保存DateTime字段时,会把本地时间转换为“UTC”类型(国际标准时)后存入数据库。

同样道理,如果在项目使用了指定的时区(例如:’Asia/Shanghai’),在数据库查询时需要进行时区转换。

是Django没有自动转换吗?

很显然不是!

Django的开发人员不会存入数据库的时候做转换,而取出的时候不做转换。

问题出在MySQL。

因为MySQL默认安装后,没有相关的时区表,从而导致无法识别“’Asia/Shanghai’”这样的时区类型。

所以,解决问题的方案就是给MySQL装载时区表。

Linux或Mac系统解决方案:

如果用的是linux或者mac系统,那么在命令行中执行以下命令:

然后输入系统密码,从系统中加载时区文件更新到MySQL中。

Windows系统解决方案:

时区支持文件可以到MySQL官方下载。

下载页面:http://dev.mysql.com/downloads/timezones.html

打开下载页面后,我们需要下载的是“timezone_2018e_posix.zip”这个压缩包。

将压缩包解压缩后,复制所有的文件(.frm、.MYD和.MYI文件),粘贴到MySQL安装目录下的“\data\mysql”目录中,将重复的文件进行替换。

完成以上操作后,重新启动MySQL服务即可。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181018A156IT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券