Django中ORM过滤时objects.filter()无法对月份过滤
django中的filter日期查询属性有:year、month、day、week_day、hour、minute、second
在做复习博客项目时,我把项目从linux移到了windows,然后博客的文章归档那一块,根据月份过滤出来的结果始终是空。然后百度了一下,结果是时区的问题。
在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ
Django中TIME_ZONE默认设置的时区是America/Chicago
若TIME_ZONE设置为其它时区的话,则还要分情况:
- 如果是Windows系统,则TIME_ZONE设置是没用的,Django会使用本机的时间
- 如果为其他系统,则使用该时区的时间,如设置USE_TZ = False, TIME_ZONE = 'Asia/Shanghai', 则使用上海的UTC时间。
django查询数据库时对应的ORM语句会用使用mysql自带的一些时间处理函数如convert_tz(时间转换函数),我们在django项目的setting文件中设置的启用时区功能USE_TZ = True,设置时区 TIME_ZONE = 'Asia/Shanghai',但是mysql不认识上海这个时区,所以mysql无法获取Asia/Shanghai的正确时间,查询的时候返回空列表。
先上终极解决办法:
# 可以使用如下方式进行筛选,筛选的值格式和你DB中的格式对应,比如是2019/04/12还是2017-04-12
article_list = ArticleModel.objects.filter(status='p', add_time__startswith='2019-04-12').order_by('-add_time')
#如果只想根据年月来筛选就是
article_list = ArticleModel.objects.filter(status='p', add_time__startswith='20179-04').order_by('-add_time')
需要注意的是 月份小于10月要和数据库匹配 需要加个0,即2019年5月需要从‘2019-5’变成‘2019-05’
解决办法1:
直接在setting.py文件中设置:USE_TZ = False
但这样的话 就无法使用django的时区功能了。(存储在数据库中的时间会小8个小时)
解决办法2:
mysql官方文档写了这两种系统天生不包含时区转换的这个文件,它没有支持windows的时区转换,如图:

所以如果是在linx,直接执行下面这条命令,如图:

如果是在windows:
下载mysql时区文件:https://dev.mysql.com/downloads/timezones.html

拷贝到C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql目录下
重启mysql
登录mysql,执行:
SET GLOBAL time_zone = 'Asia/Shanghai';
SET SESSION time_zone = 'Asia/Shanghai';
SELECT @@global.time_zone,@@session.time_zone;

来源:https://blog.csdn.net/gmsGms_gms/article/details/80748208
关于django中的时区:
django文档中有说明:当使用时区时,Django存储在数据库中的所有日期时间信息都以UTC时区为准,在后台使用有时区的datetime,前台用户使用时,在网页上翻译成用户所在的时区。
即:
Django 如果开启了 Time Zone 功能,即让 Django 内部把时间全部当成 UTC 时间(北京时间为 UTC+8 )对待。所有的存储(如存储到mysql数据库)和内部处理(在后台的各种时间处理),甚至包括直接 print 显示全都是 UTC 形式的。
这个时候,在通过模板输入时间时,会把输入的时间转换成UTC的时间,在通过模板输出时间的时候,回把UTC时间(后台都是UTC时间)转换成用户所在地的时间(除非应用支持用户设置自己所在的时区,通常我们不需要关心模板的时区问题。模板在展示时间的时候,会使用 settings.TIME_ZONE 中的设置自动把 UTC 时间转成 settings.TIME_ZONE 所在时区的时间渲染。)
启用 USE_TZ = True 后,在处理时间的时候要保证下面两点:
- 保证存储到数据库中的是 UTC 时间;
- 在函数之间传递时间参数时(后台处理)确保时间已经转换成 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)
Django中ORM过滤时objects.filter()无法对月份过滤的更多相关文章
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- 6月20日 Django中ORM介绍和字段、字段参数、相关操作
一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Django中ORM的聚合索引
Django中ORM的聚合索引 在Django中,聚合函数是通过aggregate方法实现的,aggregate方法返回的结果是一个字典 在使用时需要先导入模块from django.db.mod ...
- Django中ORM实际应用
1. Django中ORM的使用 1. 手动新建一个数据库 2. 告诉Django连接哪个数据库 settings.py里面配置数据库连接信息: # 数据库相关的配置项 DATABASES = { ' ...
- Django 中ORM 的使用
一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...
- 关于Django中ORM数据库迁移的配置
Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django. ...
- Django中ORM的使用
Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...
随机推荐
- Java 使用 Jackson库 对 JavaMap 进行序列化反序列化
最近在用 java 处理一一些东西,发现 java 对对象进行序列化反序列化比起 python 来还是有些麻烦记录一下. 找了好几个库最后选择了 Jackson 感觉大家对它评价还不错. 将目标从 J ...
- c++ map内置类型的默认值(std::map default value for build-in type)
大神的帖子,留着自己备忘:http://www.it1352.com/455626.html 结论:你看到的value是整数.浮点(初始化为零)的行为是由标准定义的,你可以依赖它. 网上还有好多帖子说 ...
- pandas批量读取带有日期的文件夹简单操作
工作中碰到了这样一个数据处理的问题,想让你把某个文件夹下的子文件夹中的excel表级联成为1张表,用excel来做会很浪费时间并且很劳累,这时候我们就可以用pandas来加大工作效率,只需要半个小时就 ...
- SpringBoot:缓存注解@Cacheable详解
1.查看@Cacheable @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @ ...
- Linux查看文件的权限
Linux查看权限命令: ls -l 文件或文件夹 输出结果示例: 这里是查看tomcat文件夹中所有子文件或者子文件夹的权限,以列表的形式列出. 关于列表的每列所代表的含义参见我的另外一篇博客:Li ...
- Linux 查看文件权限命令ls -l 输出信息每列所代表的含义
- GlusterFS 安装
一.简介 GlusterFS 是近年兴起的一个高性能开源分布式文件系统,其目标是全局命名空间.分布式前端的高性能文件系统,目前已被 RedHat 看中,GlusterFS 具有高扩展.高可性.高性能. ...
- 如何将 普通代码变成 java lamband表达式
public static void main(String[] args) { Map<String, String> map = new HashMap<>(); List ...
- CT窗宽位宽
先说一下CT值是什么 CT图像反映的是人体对X射线吸收的系数,但我们关心的是各组织结构的密度差异,即相对密度,如果某组织发生病变,其密度就会发生变化,但由于比较吸收系数非常繁琐,于是亨氏把组织器官对X ...
- freeNas 数据record