前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python测试开发django-118.json 解析查询数据库 datetime 格式问题

python测试开发django-118.json 解析查询数据库 datetime 格式问题

作者头像
上海-悠悠
发布2021-09-14 11:34:38
4580
发布2021-09-14 11:34:38
举报
文章被收录于专栏:从零开始学自动化测试

前言

django 查询的结果有日期时间格式的时候,返回的是datetime.datetime(2021, 9, 8, 0, 0)类型数据。 一般需要返回json格式数据,使用json.dumps()转的时候就会报错了

查询带时间的

Teacher模型有add_time日期时间类型DateTimeField

代码语言:javascript
复制
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class Teacher(models.Model):
    """老师表"""
    name = models.CharField(max_length=30)
    age = models.IntegerField(blank=True, null=True)
    tel = models.CharField(max_length=30)
    is_delete = models.CharField(max_length=10, default=0, blank=True)
    add_time = models.DateTimeField(auto_now=True,
                                    verbose_name="添加时间")

    def __str__(self):
        return self.name

查询结果’add_time’: datetime.datetime(2021, 9, 8, 0, 0)

代码语言:javascript
复制
>python manage.py shell
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from yoyo.models import Teacher
>>> Teacher.objects.all().values()
<QuerySet [{'id': 1, 'name': '悠悠老师', 'age': 18, 'tel': '12313231', 'is_delete': '0', 'add_time': datetime.datetime(2021, 9, 8, 0, 0}, ]

重写JSONEncoder

Json 格式是由 JavaScript 对象为基础创建的轻量级数据格式,而 JS 没有 datetime 数据类型,所以在 Python 中使用 json.dumps 会报错。 但是django查询数据库默认返回的时间日期就是datetime.datetime()格式的,直接用json.dumps()转会报错TypeError: Object of type ‘datetime’ is not JSON serializable

代码语言:javascript
复制
import json
import datetime
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class DateEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime("%Y-%m-%d %H:%M:%S")
        else:
            return json.JSONEncoder.default(self, obj)

data = [{'id': 1, 'name': '悠悠老师', 'age': 18, 'tel': '12313231', 'is_delete': '0', 'add_time': datetime.datetime(2021, 9, 8, 0, 0)}]

print(json.dumps(data, cls=DateEncoder))

结果返回

代码语言:javascript
复制
[{"id": 1, "name": "\u60a0\u60a0\u8001\u5e08", "age": 18, "tel": "12313231", "is_delete": "0", "add_time": "2021-09-08 00:00:00"}]

django里面关于日期处理,可以看之前写的 extra格式化日期时间https://www.cnblogs.com/yoyoketang/p/13215719.html ModelSerializer 序列号日期https://www.cnblogs.com/yoyoketang/p/14291166.html 在Model模型自定义to_dict()方法可以完美解决 https://www.cnblogs.com/yoyoketang/p/15244171.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 查询带时间的
  • 重写JSONEncoder
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档