python測試開發django-118.json 解析查詢資料庫 datetime 格式問題
阿新 • • 發佈:2021-09-08
前言
django 查詢的結果有日期時間格式的時候,返回的是datetime.datetime(2021, 9, 8, 0, 0)型別資料。
一般需要返回json格式資料,使用json.dumps()轉的時候就會報錯了
查詢帶時間的
Teacher模型有add_time日期時間型別DateTimeField
# 作者-上海悠悠 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)
>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
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))
結果返回
[{"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