Django ORM查询,在查询语句中格式化日期
程序员文章站
2024-02-22 23:10:04
...
问题描述
- Django版本:Django2.1.4
- 数据库:MySQL5.7
使用过Django框架的朋友应该都知道Django models中的DateTimeField类型。
DateTimeField在MySQL数据库中插入的时间格式是“2019-02-16 10:25:04.186496”。
使用普通的ORM查询语句,输出的DateTimeField字段是“datetime.datetime(2019, 2, 16, 10, 8, 44, 642364)”。
如果你使用模版渲染的话,可以在前端页面使用过滤器格式化DateTimeField,获取正确的时间格式,例如:{{ infor.updatetime|date:“Y-m-d H:i:s” }}。
但是,如果我们想通过ajax json获取DateTimeField字段时就会报错,DateTimeField不能直接转换成json。
解决办法
笨点的办法
使用 for 循环去遍历查询结果,在 for 循环内使用 .strftime(’%Y-%m-%d %H:%M:%S’) 去格式化时间,然后转换成json。
如:
res_list = []
for i in data_obj:
i['inTime'] = i['inTime'].strftime('%Y-%m-%d %H:%M:%S')
res_list.append(i)
能用倒是能用,但是看起来太 low 了。
更高效的办法
能不能通过修改查询语句,使查询结果直接输出格式化后的时间呢?
首先确定,Django的原生查询是不支持直接输出格式化后的日期的,那么我们只能使用MySQL的函数了。
使用 extra 可以很好的解决这个问题,使用 extra 可以执行 MySQL 的函数。extra 的内容大家可以自行百度。
# inTime是models中的字段名
list_raw = models.testTable.objects.filter(disable=0)\
.extra(select={"inTime": "DATE_FORMAT(inTime, '%%Y-%%m-%%d %%H:%%i:%%s')"})\
.values('id', 'showName', 'inTime').order_by('-inTime')
这样就能在查询语句中对DateTimeField进行格式化了。
补充
使用不同的数据库,格式化日期的函数可能不同,里面可能会有点小坑。
上一篇: SD-Host SD_CLK模块