欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django ORM查询,在查询语句中格式化日期

程序员文章站 2024-02-22 23:10:04
...

Django ORM查询,在查询语句中格式化日期

问题描述

  • 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进行格式化了。

补充

使用不同的数据库,格式化日期的函数可能不同,里面可能会有点小坑。