环境
- 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"
重新迁移模型类,然后我们就会发现数据库的字段类型和数据格式已经变成我们想要的了
如果有什么不对的地方,欢迎各位大佬指正!!