时间: 2020-08-30|tag:28次围观|0 条评论

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

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 modelsdef 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

文章转载于:https://www.jianshu.com/p/74d02fddc691

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《Django models 时间类型 Field 中的 auto_now 与 auto_now_add
   

还没有人抢沙发呢~