问题描述:
Django ORM 的Q对象查询,<字段名>__range 和 __date__range 的查询结果不一样,__range能正常查询出记录, __date__range 一条都查不出来
from django.db.models import Q
import datetime
from_date = datetime.date(2021, 4, 1)
end_date = datetime.date(2021, 4, 28)
# 此时数据库中有一条create_time 2021-4-5 的数据
query_term = Q(create_time__date__range=[from_date, end_date])
SendUserTaskRewardRecord.objects.filter(query_term)
# 查询结果为空
query_term = Q(create_time__date__range=[from_date, end_date])
SendUserTaskRewardRecord.objects.filter(query_term)
# 有查询结果
先说结论
mysql中缺失了时区转换函数
解决办法:https://dev.mysql.com/doc/refman/8.0/en/mysql-tzinfo-to-sql.html
# 命令行执行以下内容
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
解决过程:
>>> print(SendUserTaskRewardRecord.objects.filter(query_term).query)
SELECT `task_sendusertaskrewardrecord`.`id`, `task_sendusertaskrewardrecord`.`create_time`, `task_sendusertaskrewardrecord`.`task_id`, `task_sendusertaskrewardrecord`.`username` FROM `task_sendusertaskrewardrecord` WHERE DATE(CONVERT_TZ(`task_sendusertaskrewardrecord`.`create_time`, 'UTC', 'UTC')) BETWEEN 2021-04-01 AND 2021-04-28
# 注意 CONVERT_TZ 函数, 这是mysql对时区的支持
# 进入 mysql 交互界面
select count(*) from mysql.time_zone_name;
# 返回0,意思是mysql还没有配置时区表
# 根据 https://dev.mysql.com/doc/refman/8.0/en/mysql-tzinfo-to-sql.html
# 进 /usr/share/zoneinfo 看看有没有这个目录或者里面有没有东西,在系统命令行(iterm)执行对应load time table 的命令
# iterms:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
# mysql 交互界面:
select count(*) from mysql.time_zone_name;
# 现在就有返回了,回去orm发现查询也正常了