Django models.DatetimeField 保存到数据库时的格式化问题

文章讲述了在DjangoORM中,DateTimeField默认的数据库存储格式为datetime(6),即包含毫秒。作者提供了两种方法来处理这个问题:一是每次从数据库读取时手动格式化,二是自定义DateTimeField并重写db_type方法以控制精度。通过自定义字段,可以确保数据库字段类型为datetime(0)并保持%Y-%m-%d%H:%M:%S格式。
摘要由CSDN通过智能技术生成

环境

  • python3.8
  • Django==3.2.23

Django ORM 的 DateTimeField(日期时间)字段是日常业务中使用频率较高的字段类型,如果我们只是简单的使用,会出现一些问题。

from django.db.models import IntegerField,DateTimeField

class TestModel(Model):
    create_time = DateTimeField(verbose_name="创建时间", auto_now_add=True)
    update_time = DateTimeField(verbose_name="更新时间", auto_now=True)
    delete_time = DateTimeField(verbose_name="删除时间", null=True)
    status = IntegerField(default=1, verbose_name="状态")
    
	class Meta:
		db_table = "test"

把上面这个模型类迁移到数据库时,会发现DateTimeField对应的字段不是%Y-%m-%d %H:%M:%S格式的,而是带有小数点,也就是毫秒,我们在查看数据库字段类型的时候,是 datetime(6)类型
在这里插入图片描述
在这里插入图片描述
我想要的格式是%Y-%m-%d %H:%M:%S,数据库字段类型对应的是 datetime(0)
先来看一下字段迁移到数据库时,是怎么把 DatetimeField 字段转换为 datetime 类型的。
在这里插入图片描述
DatetimeField 字段在迁移到数据库时,对应的字段类型是 datetime(6)。想要满足格式化的需求,有两种办法

1、在读数据库数据时,每次都格式化时间(麻烦,不推荐)

test = Test.objects.get(id=1)
create_time = test.create_time.strftime("%Y-%m-%d %H:%M:%S")

2、自定义 DatetimeField 字段,重写字段映射方法(推荐)

from django.db import models
from django.db.models import IntegerField

class DateTimeFieldFormat(models.DateTimeField):
    """
    数据库datetime类型字段格式化(%Y-%m-%d %H:%M:%S)
    precision:需要保留的小数位数
    """
    def __init__(self, verbose_name=None, name=None, precision=0, **kwargs):
        self.precision = precision
        super().__init__(verbose_name, name, **kwargs)

    def db_type(self, connection):
        return 'datetime(%d)' % self.precision


class TestModel(models.Model):
    create_time = DateTimeFieldFormat(verbose_name="创建时间", auto_now_add=True)
    update_time = DateTimeFieldFormat(verbose_name="更新时间", auto_now=True)
    delete_time = DateTimeFieldFormat(verbose_name="删除时间", null=True)
    status = IntegerField(default=1, verbose_name="状态")
    
	class Meta:
		db_table = "test"

重新迁移模型类,然后我们就会发现数据库的字段类型和数据格式已经变成我们想要的了
在这里插入图片描述
在这里插入图片描述
如果有什么不对的地方,欢迎各位大佬指正!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值