Django - 日期、时间字段

 

创建django的model时,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add,表面上看起来很easy,但实际使用中很容易出错,下面是一些注意点。

DateTimeField.auto_now

auto_now 想要生效,自动修改时间,需要obj.save()

这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的。

DateTimeField.auto_now_add

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

admin中的日期时间字段

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

class YourAdmin(admin.ModelAdmin):
readonly_fields = ('save_date', 'mod_date',)
admin.site.register(Tag, YourAdmin)

如何将创建时间设置为“默认当前”并且可修改

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

django中所有的model字段都拥有一个default参数,用来给字段设置默认值。可以用default=timezone.now来替换auto_now=True或auto_now_add=True。timezone.now对应着django.utils.timezone.now(),因此需要写成类似下面的形式:

from django.db import models
import django.utils.timezone as timezone
class Doc(models.Model):
add_date = models.DateTimeField('保存日期',default = timezone.now)
mod_date = models.DateTimeField('最后修改日期', auto_now = True)

https://www.cnblogs.com/huchong/p/7895263.html

最新文章

  1. Atitit.研发团队与公司绩效管理的原理概论的attilax总结
  2. Web.xml配置详解
  3. python列表、元祖、字典
  4. Zookeeper集群服务部署
  5. USB协议(1)
  6. Money类
  7. lispbox 安装运行.sh的时候出现 lispbox.sh: 2: lispbox.sh: Bad substitution
  8. 介绍几种大型的Oracle/SQL Server数据库免费版
  9. macaca web(4)
  10. iOS-AFNetworking封装Get(自定义HTTP Header)和Post请求及文件下载
  11. java之Hibernate框架实现数据库操作
  12. Python——Django-form表单提交
  13. dubbo框架初步学习
  14. 支付-stripe
  15. 解决Tax discount configure 报出异常
  16. 04 flask 项目整体构建
  17. 关于传统项目打成war包的的分析
  18. 【Linux】rpm常用命令及rpm参数介绍
  19. 20155314 2016-2017-2 《Java程序设计》第8周学习总结
  20. .Net执行cmd命令

热门文章

  1. Qt开发经验小技巧1-10
  2. Springboot项目中异常拦截设计与处理
  3. Influx Sql系列教程九:query数据查询基本篇二
  4. layui父页面获取子页面数据
  5. OpenDrive格式地图
  6. npm包的语义版本控制(Semantic Versioning of Packages)
  7. sql查询出现1055 this is incompatible with sql_mode=only_full_group_by
  8. 【Centos】Centos7.5取消自动锁屏功能
  9. Loader ,URLLoader ,URLStream的区别
  10. appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠