Django models 时间类型 Field 中的 auto_now 与 auto_now_add

注意:作者懒癌发作,可能写反了。请读者参照评论进行修改。

auto_nowauto_now_add 是Django 的 models 中,关于时间的两个属性参数。比如可以用在 DateField() 或者 DateTimeField() 的属性中。

1 auto_now 与 auto_now_add 的比较

  • auto_now=True 表示某个字段(或者对象)第一次保存的时候,由系统生成的。自动继承了不可更改的属性 editable=False,所以一旦设定就不可以更改、不可以再次重载(override),因此在后台 admin 中也不会显示出来。通常可以用在注册时间、生成时间等字段。
  • auto_now_add=False 是字段每次修改的时候,最新的时间都会保存进去。

使用示例,对于一个评论的 models, timestamp 是首次发表时间,updated 是最新编辑成功的时间:

from django.db import models

def comment(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

注意

  • auto_nowauto_now_add 不能同时为 True,在之前的Django版本,如果两者同时为空会抛异常。

2 使用情况考虑

auto_nowauto_now_add 从 Django 1.4.5 开始就相当于使用了 timezone.now(),而不是 datetime.now()

Django 与 pytz 的建议,如果对时间的准确度有相当高的要求(比如涉及到钱的情况),最好是把时间对象存储为 UTC 时间(全球标准时间,即格林威治时间),然后用户使用时再转化成本地时间(与时区相关)。

Django 的时间依赖于 pytz 包,但是在 Django 1.11 之前,Django 会查看是否存在 pytz 包,然后去使用该包的时区数据库。在 Django 1.11 以后,pytz 是默认随着 Django 一起安装了,但是 Django 的 settings.py 中,USE_TZ=False 是关闭的,要使用时区时,需要自己去打开。

参考

Django官方文档:DateField.auto_now 与 DateField.auto_now_add

stackoverflow: Django auto_now and auto_now_add

Django之TIME_ZONE初探

Django 1.11 官方文档:Time zones

Django 1.8.2 官方文档中文翻译:时区

pytz - World Timezone Definitions for Python

stackoverflow: How django time zone works with model.field's auto_now_add

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容