我们在用Django创建models时,常常会涉及时间日期字段的处理,Django里日期相关Field有DateTimeField、DateField和TimeField三种类型,看似简单,但其中有一些容易出错的地方需要注意;另外,如果不习惯Django的默认时间格式,也可以自定义的修改。

DateTimeField、DateField和TimeField,其值分别对应着Python里的datetime.datetime、datetime.date和datetime.time三个实例,这三个Field里都有两个参数:auto_now和auto_now_add,默认值均为False。

auto_now参数说明:

每次保存对象时自动将字段值设置为当前时间,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便,常用类似“last-modified”或者"update_time"字段。

需要注意的是,该字段不能被手动修改覆盖;当设置为true时,只有每次调用Model.save()时,才会强制更新为当前时间点;当用其他方式更新其他字段时并不会更新:比如用QuerySet.update()方法,即使为该字段指定一个自定义的值,该字段也不会有所更改。比较直观的表现形式是,如果使用django自带的admin管理器,那么该字段在admin中是只读的,并且无法进行修改。示例代码如下:

class Datacenter(models.Model):id = models.UUIDField('机房ID', default=uuid.uuid4, primary_key=True)zone = models.ForeignKey(Zone, verbose_name='所在区域', on_delete=models.PROTECT)dc_name = models.CharField('机房', max_length=128, unique=True)networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True)update_time = models.DateTimeField('更新时间', auto_now=True)def __str__(self):return self.dc_nameclass Meta:verbose_name = '机房配置'verbose_name_plural = '机房配置'

Datacenter的ModelAdmin代码:

class DatacenterAdmin(admin.ModelAdmin):list_display = ['id', 'dc_name', 'zone', 'networks', 'update_time']search_fields = ['dc_name', 'zone', 'networks']list_filter = ['dc_name', 'zone']ordering = ['networks', 'zone']
admin.site.register(models.Datacenter, DatacenterAdmin)

Admin界面效果图:

点击编辑页面,会发现找不到‘更新时间’的编辑处,因为此字段是只读,且不允许手动修改,效果图如下:

当页面“save”之后,再观察现在的‘更新时间’发现时间已经被修改:

auto_now_add参数说明:

设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

继续沿用刚才的代码示例,‘update_time’的’auto_now’改完’auto_now_add’,其他代码不变:

class Datacenter(models.Model):id = models.UUIDField('机房ID', default=uuid.uuid4, primary_key=True)zone = models.ForeignKey(Zone, verbose_name='所在区域', on_delete=models.PROTECT)dc_name = models.CharField('机房', max_length=128, unique=True)networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True)update_time = models.DateTimeField('更新时间', auto_now_add=True)

编辑更新北京联通机房的IP地址段之后保存:

更改之后‘更新时间’并未发生改变(见下图),因为‘auto_now_add’在对象创建完成后即不再更新:

如何实现可编辑

auto_now和auto_now_add被设置为True后,这样做会导致字段成为editable=False和blank=True的状态。editable=False将导致字段不会被呈现在admin中,blank=Ture表示允许在表单中不输入值。此时,如果在admin的fields或fieldset中强行加入该日期时间字段,那么程序会报错,admin无法打开;如果在admin中修改对象时,想要看到日期和时间,可以将日期时间字段添加到admin类的readonly_fields中:

readonly_fields = ('save_date', 'mod_date',)

那么问题来了。实际场景中,往往既希望在对象的创建时间默认被设置为当前值,又希望能在日后修改它。怎么实现这种需求呢?

django中所有的model字段都拥有一个default参数,用来给字段设置默认值。可以用default=timezone.now来替换auto_now=True或auto_now_add=True。timezone.now对应着django.utils.timezone.now(),代码示例:

from django.utils import timezoneclass Datacenter(models.Model):id = models.UUIDField('机房ID', default=uuid.uuid4, primary_key=True)zone = models.ForeignKey(Zone, verbose_name='所在区域', on_delete=models.PROTECT)dc_name = models.CharField('机房', max_length=128, unique=True)networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True)update_time = models.DateTimeField('更新时间', default=timezone.now())def __str__(self):return self.dc_nameclass Meta:verbose_name = '机房配置'verbose_name_plural = '机房配置'

这里’update_time’字段默认值改为timezone.now()后,再次编辑已经能看到相应‘更新时间’字段,并且可修改:

我们把时间天数加1天后,保存退出再观察‘更新时间’已经变为自定义时间:

自定义日期格式:

刚创建的Django应用,可能你看到的日期显示格式跟下图类似(跟LANGUAGE_CODE和TIME_ZONE有关):

![可能的默认日期格式](https://s4.51cto.com/images/blog/201803/23/164dc709843a56536c09c9142775a553.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

如果不习惯这种格式,自己定义显示格式的配置如下,更改Django的setting.py文件:

USE_L10N = False
DATE_FORMAT = 'Y-m-d'
DATETIME_FORMAT = 'Y-m-d H:i:s'

注意事项:如果USE_L10N设置为了True,那么语言环境规定的格式具有更高的优先级并将被应用,即DATE_FORMAT不生效。
这里可用的格式化字符串的其他写法参见Django官方文档:

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date;
Available format strings,部分截图:

另外在Django页面渲染的时候,html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,另外一个解决办法:可以在页面格式化时间,添加{{ Datacenter.updatetime|date:“Y-m-d H:i:s” }}类似的过滤器。之后刷新页面,即可正常显示。

相关文档:

https://docs.djangoproject.com/en/2.0/ref/settings/

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#std:templatefilter-date

Django中的日期处理注意事项和自定义时间格式转换相关推荐

  1. 语言 全排列 函数_Power Query 中日期时间格式转换需要了解的区域语言对照表

    不同的国家有不同的日期时间书写格式,比如: 多数亚洲国家:yyyy-MM-dd hh:mm 有些欧洲国家:dd.MM.yyyy HH:mm 极少数的国家:MM/dd/yyyy h:mm tt 还有各种 ...

  2. 如何通过数据库SQL Server 2014中的SQL日期格式化语句来转换出我们需要的日期格式化日期时间格式转换的教程方法

    如何通过数据库SQL Server 2014中的SQL日期格式化语句来转换出我们需要的日期格式化日期时间格式转换的教程方法 作者:张国军_Suger 开发工具与关键技术:SQL Server 2014 ...

  3. mysql转换年月日_mysql 日期和时间格式转换实现语句

    mysql 日期和时间格式转换实现语句 更新时间:2009年10月24日 00:25:22   作者: 对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. ...

  4. java时间格式转换_Java时间日期格式转换

    突然忘记了时间格式怎么转换,特此做个记录 Java时间格式转换大全 import java.text.*; import java.util.Calendar; public class VeDate ...

  5. mysql带中文日期转换_【MySQL】日期时间格式转换_MySQL

    bitsCN.com [MySQL]日期时间格式转换 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: www.bitsCN.com mysql> ...

  6. vue 中常见的时间格式转换

    项目中后台返回的时间有多种形式,时间戳.ISO标准时间格式等,我们需要转化展示成能看的懂得时间格式: 将2022-05-27T14:20:27.000000Z 时间格式转换成 2022-05-27 1 ...

  7. java 日期格式化 英文_Java SimpleDateFormat 中英文时间格式化转换

    SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期)和规范化. SimpleDateFor ...

  8. sql时间转换时分秒_SqlServer 日期时间格式转换(SQL server date time format conversion).doc...

    SqlServer 日期时间格式转换(SQL server date time format conversion) SqlServer 日期时间格式转换(SQL server date time f ...

  9. Between 的开始日期和结束日期是同一天没有查询结果,附SQL server数据库的日期时间格式转换大全

    Between 的开始日期和结束日期是同一天没有查询结果 原因: 条件和参数不是一个格式)如字段的类型里包含了时间分钟秒,但是给的条件里没有这些,只有时间 between会在日期后面自动追加" ...

最新文章

  1. 新建表维护程序SM30
  2. EF-InvalidOperation系列
  3. mysql 左连接 例子_mysql左连接自连接例子
  4. oracle误删scott文件如何恢复
  5. Spring/Spring Boot微服务项目 集成Druid 实现监控功能
  6. 开发时对业务技术框架的理解
  7. iometer-2006_07_27.common-src编译
  8. python 字节码指令含义_python 字节码指令列表
  9. PowerManager.WakeLock使用(屏幕恒亮)
  10. 单元测试界的高富帅,Pytest框架,手把手教学,高阶用法实战
  11. 不同网段的直连怎么互通_什么样的网络能互通,什么样的网络不能互通?
  12. android apk 可以直接放在systemapp下吗,内置语音apk到/system/app下的问题
  13. Atitit it软件领域职称评级规定,精深方向。 目录 1. 软件工程师资格证 1 1.1. 法规规范 十大标准,三级五晋制。 1 1.2. 三级制 使用者 原理维修者 制造设计者 1 1.3.
  14. 华为p9总显示切换服务器中,怎么更改华为p9的多任务切换 | 手游网游页游攻略大全...
  15. 误删除文件恢复工具免费下载
  16. Python正则表达式和re模块,完美匹配中文与中文标点符号
  17. python魔术方法(一)
  18. 由NPLM到Word2vec
  19. 目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的监护系统,试写出问题定义并且分析开发这个系统的可行性
  20. 通读Docs - 《OPL1000 自学整理教程》

热门文章

  1. 从报表到数据可视化,我用这五步,成功搭建银行大数据架构
  2. 作为现代行业才有的程序员为何地位不高?
  3. 今天的从上往下望去的企业即时通讯
  4. 【推荐】飞鸽传书2013官方下载
  5. 『转』死去度百飞鸽传书
  6. 从单纯聊天到在线生活
  7. HOWTO:将 IOCTL 发送到筛选器驱动程序
  8. 对USB驱动程序的理解
  9. 零基础也能学会的小游戏编程!入门级别实践
  10. 小学计算机教案表格式,小学信息技术教案表格数据处理.docx