Django models 时间类型 Field 中的 auto
2017-07-17 本文已影响254人
Tim_Lee
auto_now
与 auto_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_now
与auto_now_add
不能同时为 True,在之前的Django版本,如果两者同时为空会抛异常。
2 使用情况考虑
auto_now
与 auto_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
pytz - World Timezone Definitions for Python
stackoverflow: How django time zone works with model.field's auto_now_add