热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django中ORM过滤时objects.filter()无法对月份过滤

django中的filter日期查询属性有:year、month、day、week_day、hour、minute、second在做复习博客项目时,我把项目从linux移到了win

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的时区转换,如图:
Django中ORM过滤时objects.filter()无法对月份过滤

所以如果是在linx,直接执行下面这条命令,如图:
Django中ORM过滤时objects.filter()无法对月份过滤

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

Django中ORM过滤时objects.filter()无法对月份过滤

 拷贝到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;

Django中ORM过滤时objects.filter()无法对月份过滤

来源: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)

转自:https://www.cnblogs.com/ChangAn223/p/10928230.html

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的时区转换,如图:
Django中ORM过滤时objects.filter()无法对月份过滤

所以如果是在linx,直接执行下面这条命令,如图:
Django中ORM过滤时objects.filter()无法对月份过滤

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

Django中ORM过滤时objects.filter()无法对月份过滤

 拷贝到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;

Django中ORM过滤时objects.filter()无法对月份过滤

来源: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)

转自:https://www.cnblogs.com/ChangAn223/p/10928230.html

推荐阅读
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • Vim 编辑器功能强大,但其默认的配色方案往往不尽如人意,尤其是注释颜色为蓝色时,对眼睛极为不友好。为了提升编程体验,自定义配色方案显得尤为重要。通过合理调整颜色,不仅可以减轻视觉疲劳,还能显著提高编码效率和兴趣。 ... [详细]
  • 虚函数表指针vptr的功能测试与分析
    类的虚函数调用依赖于虚函数表来实现。虚函数表是由编译器自动生成的一段内存区域,用于存储包含虚函数的类中每个虚函数的入口地址。这些入口地址本质上是指针类型,从而使得动态绑定成为可能。本文对虚函数表指针(vptr)的功能进行了详细的测试与分析,探讨了其在多态性和继承机制中的作用及其性能影响。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在 iOS 开发中,经常会遇到 `@(YES)`、`@[firstViewController]` 以及 `@{@a:@b}` 这样的语法糖。这些简化的写法分别用于初始化布尔值、数组和字典对象,能够显著提高代码的可读性和编写效率。例如,`@(YES)` 可以快速创建一个布尔值对象,`@[firstViewController]` 则用于创建包含单个元素的数组,而 `@{@a:@b}` 则用于创建键值对字典。理解这些语法糖的使用方法,有助于开发者更加高效地进行编码。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
author-avatar
石头
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有