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

前言

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
在Model模型自定义to_dict()方法可以完美解决 https://www.cnblogs.com/yoyoketang/p/15244171.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 中,可以使用 Celery 和 Django-celery-beat 库来实现周期定时任务。 步骤如下: 1. 安装 Celery 和 Django-celery-beat 库: ```python pip install celery pip install django-celery-beat ``` 2. 在 Django 的 settings.py 文件中配置 Celery: ```python # settings.py # Celery 配置 CELERY_BROKER_URL = 'amqp://guest@localhost//' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_RESULT_BACKEND = 'django-db' CELERY_TIMEZONE = 'Asia/Shanghai' ``` 3. 在 Django 的 settings.py 文件中添加 Django-celery-beat 应用: ```python # settings.py INSTALLED_APPS = [ # ... 'django_celery_beat', ] ``` 4. 在 Django 的 urls.py 文件中添加 Celery 的 beat 路由: ```python # urls.py from django.urls import path from django_celery_beat.views import Beat urlpatterns = [ # ... path('celery-beat/', Beat.as_view(), name='celery-beat'), ] ``` 5. 在 Django 的任意位置创建一个 tasks.py 文件,并定义周期任务: ```python # tasks.py from celery import shared_task from datetime import datetime @shared_task def test_task(): print('当前时间:', datetime.now().strftime('%Y-%m-%d %H:%M:%S')) ``` 6. 在 Django 的 settings.py 文件中配置周期任务: ```python # settings.py CELERY_BEAT_SCHEDULE = { 'test_task': { 'task': 'tasks.test_task', 'schedule': 30.0, # 每 30 秒执行一次 }, } ``` 7. 启动 Celery: ```python celery -A your_project_name worker -l info celery -A your_project_name beat -l info ``` 8. 访问 http://127.0.0.1:8000/celery-beat/ 可以查看周期任务的执行记录。 注意:以上步骤中的 your_project_name 需要替换为你的项目名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值