Django datetime, datetimefield, auto_now, auto_now_add

主要有这几点疑问:

1. auto_now为True时,更新记录时,自动更新时间,创建新纪录时也会帮你自动添加创建时的时间,但是在更新时只有使用save方法的方式的形式更新才能自动更新时间

2. datetime datetimefield 不能添加为editeable

关于第一点疑问,目前没有实例来验证,待更新

关于第二点疑问:

当我将DatetimeField, 或者DateField在admin中添加到list_editable中时提示如下错误:

<class 'blog.admin.ArticleAdmin'>: (admin.E125) The value of 'list_editable[1]' refers to 'publish_date',
 which is not editable through the admin.

根本原因:

我在model中对该字段设置了auto_add_now=True

 

我们知道,在django中,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add.下面分别说下:

 

DateTimeField:

    auto_now:默认为False, 当它被设置为True时,在保存该字段时,它的值被设置成当前时间,每次修改model, 都会自动更新.也就是说:它适用于要保留"最后修改时间"的场景.但同时,在django admin管理器中,它将是readonly状态, 也就是无法修改的,像上面提示的错误那样.

    auto_now_add:默认为False, 设置为True时,会在Model第一次创建时将字段时间保存为创建时间, 后面对model进行修改,它的值仍然保持为创建时的时间,也就是说:它适用于要保留"创建时间"的场景.同样,如果它被设置为True, 在admin中也是readonly状态.

 

那么,这有什么影响呢?

当auto_now, auto_now_add被设置为True时, 会导致字段变成editable=False,blank=True, 而editable=False又会导致字段不会显示在admin中, 假若强制在admin中显示,就会报错,此时只有一个办法,将该字段加入到readonly_fields中.

 

这样看来,DateTimeField, DateFeild不是不能修改了吗?有时候就有要修改时间的需求啊?

    我们知道model中字段都有一个default参数, 它用来给字段设置默认值,而当前时间又可以通过timezone.now来得到

from django.utils import timezone

 

publish_date = models.DateField(verbose_name='发表日期', default=timezone.now)

这样在admin的list_editable中加入该 字段, 后台就可以既保存当前时间, 又能修改.

 

上一篇:mysql forget root password

下一篇:mysql 语句